Xiao_123 пре 2 месеци
родитељ
комит
5c889b889d
58 измењених фајлова са 234 додато и 6315 уклоњено
  1. 53 0
      custom-tab-bar/index.js
  2. 4 0
      custom-tab-bar/index.json
  3. 14 0
      custom-tab-bar/index.wxml
  4. 74 0
      custom-tab-bar/index.wxss
  5. 8 230
      pages.json
  6. 1 1
      pages/index/communicate.vue
  7. 0 305
      pages/index/crowdsourcing.vue
  8. 1 28
      pages/index/my.vue
  9. 10 0
      pages/index/position.vue
  10. 12 1
      pages/index/resume.vue
  11. 0 82
      pagesA/collect/company.vue
  12. 0 26
      pagesA/collect/index.vue
  13. 0 51
      pagesA/collect/position.vue
  14. 0 198
      pagesA/coupon/index.vue
  15. 0 175
      pagesA/integral/index.vue
  16. 0 123
      pagesA/recommendation/index.vue
  17. 0 70
      pagesA/recommendation/list.vue
  18. 0 93
      pagesA/resumeAnalysis/components/advantage.vue
  19. 0 119
      pagesA/resumeAnalysis/components/avatarEdit.vue
  20. 0 180
      pagesA/resumeAnalysis/components/baseInfoEdit.vue
  21. 0 177
      pagesA/resumeAnalysis/components/educationExp.vue
  22. 0 137
      pagesA/resumeAnalysis/components/trainingExperience.vue
  23. 0 182
      pagesA/resumeAnalysis/components/workExperience.vue
  24. 0 221
      pagesA/resumeAnalysis/index.vue
  25. 0 9
      pagesA/resumeAnalysis/testData.js
  26. 0 50
      pagesA/resumeOnline/advantage.vue
  27. 0 214
      pagesA/resumeOnline/baseInfoEdit.vue
  28. 0 94
      pagesA/resumeOnline/dict.js
  29. 0 177
      pagesA/resumeOnline/educationExp.vue
  30. 0 637
      pagesA/resumeOnline/index.vue
  31. 0 177
      pagesA/resumeOnline/jobIntention.vue
  32. 0 131
      pagesA/resumeOnline/portrait.vue
  33. 0 134
      pagesA/resumeOnline/trainingExperience.vue
  34. 0 158
      pagesA/resumeOnline/vocationalSkills.vue
  35. 0 181
      pagesA/resumeOnline/workExperience.vue
  36. 0 151
      pagesA/seenMe/index.vue
  37. 0 174
      pagesB/about/index.vue
  38. 0 276
      pagesB/companyDetail/index.vue
  39. 56 3
      pagesB/contactUs/index.vue
  40. 0 72
      pagesB/headhunting/components/contact.vue
  41. 0 107
      pagesB/headhunting/components/nav.vue
  42. 0 206
      pagesB/headhunting/index.vue
  43. 0 71
      pagesB/headhunting/pages/contact.vue
  44. 0 105
      pagesB/headhunting/pages/details.vue
  45. 0 135
      pagesB/headhunting/pages/service.vue
  46. 0 115
      pagesB/inviteRecord/index.vue
  47. 0 70
      pagesB/inviteRecord/list.vue
  48. 0 162
      pagesB/preferredGroup/index.vue
  49. 0 141
      pagesB/recommendEnterprise/index.vue
  50. 0 165
      pagesB/sharePoster/index.vue
  51. BIN
      static/img/group.png
  52. BIN
      static/img/headhunting.png
  53. BIN
      static/img/information.png
  54. BIN
      static/img/share-cover-border.jpg
  55. BIN
      static/img/welfare.png
  56. 0 0
      static/svg/student.svg
  57. 0 0
      static/svg/workMan.svg
  58. 1 1
      utils/position.js

+ 53 - 0
custom-tab-bar/index.js

@@ -0,0 +1,53 @@
+Component({
+  data: {
+    selected: 0,
+		show: true,
+    color: "#7A7E83",
+    selectedColor: "#00B760",
+    list: [
+			{
+				"pagePath": "pages/index/resume",
+				"text": "简历",
+				"iconPath": "/static/img/resume.png",
+				"selectedIconPath": "/static/img/resume-fill.png"
+			},
+			{
+				"pagePath": "pages/index/position",
+				"text": "求职",
+				"iconPath": "/static/img/position.png",
+				"selectedIconPath": "/static/img/position-fill.png"
+			},
+			{
+				"pagePath": "pages/index/communicate",
+				"text": "沟通",
+				"iconPath": "/static/img/message.png",
+				"selectedIconPath": "/static/img/message-fill.png"
+			},
+			{
+				"pagePath": "pages/index/my",
+				"text": "企业",
+				"iconPath": "/static/img/company.png",
+				"selectedIconPath": "/static/img/company-fill.png"
+			}
+		]
+  },
+  lifetimes: {  
+
+  },
+  created(){
+	  console.log(11111111111111111111)
+  },
+  methods: {
+    switchTab(e) {
+			console.log(e, '======================')
+      const data = e.currentTarget.dataset
+      const url = data.path
+      wx.switchTab({
+        url
+      })
+      this.setData({  
+        selected: data.index  
+      })
+    }
+  }
+})

+ 4 - 0
custom-tab-bar/index.json

@@ -0,0 +1,4 @@
+{
+  "component": true,
+  "usingComponents": {}
+}

+ 14 - 0
custom-tab-bar/index.wxml

@@ -0,0 +1,14 @@
+<!--miniprogram/custom-tab-bar/index.wxml-->
+<view class="tab-bar" style="display: {{ show ? 'flex' : 'none'}}">
+  <view
+    wx:for="{{list}}"
+    wx:key="index"
+    class="tab-bar-item {{ item.center ? 'center' : ''}}"
+    data-path="{{item.pagePath}}"
+    data-index="{{index}}"
+    bindtap="switchTab"
+  >
+    <image src="{{selected === index ? item.selectedIconPath : item.iconPath}}"></image>
+    <view style="color: {{selected === index ? selectedColor : color}};z-index: 1;">{{item.text}}</view>
+  </view>
+</view>

+ 74 - 0
custom-tab-bar/index.wxss

@@ -0,0 +1,74 @@
+.tab-bar {
+  position: fixed;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  height: 60px;
+  background: white;
+  display: flex;
+  padding-bottom: env(safe-area-inset-bottom);
+  border-radius: 20px 20px 0 0;
+  box-shadow: 0px 8px 20px 0px rgba(0,0,0,.5);
+  z-index: 0;
+}
+
+.tab-bar-border {
+  background-color: rgba(0, 0, 0, 0.33);
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: 100%;
+  height: 1px;
+  transform: scaleY(0.5);
+}
+
+.tab-bar-item {
+  flex: 1;
+  text-align: center;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  flex-direction: column;
+  position: relative;
+}
+
+.tab-bar-item.center {
+  margin-top: -20px;
+}
+.tab-bar-item.center image {
+  width: 56px;
+  height: 56px;
+  z-index: 3;
+  border-radius: 50%;
+}
+.tab-bar-item.center::before {
+  content: '';
+  width: 64px;
+  height: 32px;
+  position: absolute;
+  left: 50%;
+  top: 0;
+  transform: translate(-50%, 0px);
+  background: #FFF;
+  border-radius: 180px 180px 0 0 ;
+  box-shadow: 0px 8px 20px 0px rgba(0,0,0,.5);
+  /* clip-path: inset(0 0 66.66% 0); 裁剪三分之一高度 */
+}
+.tab-bar-item.center::after {
+  content: '';
+  width: 100px;
+  height: 40px;
+  position: absolute;
+  left: 50%;
+  top: 20px;
+  background: #FFF;
+  transform: translate(-50%, 0px);
+}
+.tab-bar-item image {
+  width: 27px;
+  height: 27px;
+}
+
+.tab-bar-item view {
+  font-size: 12px;
+}

+ 8 - 230
pages.json

@@ -15,12 +15,6 @@
 				"navigationBarTitleText": "职位"
 				"navigationBarTitleText": "职位"
 			}
 			}
 		},
 		},
-		{
-			"path": "pages/index/my",
-			"style": {
-				"navigationBarTitleText": "我的"
-			}
-		},
 		{
 		{
 			"path": "pages/login/index",
 			"path": "pages/login/index",
 			"style": {
 			"style": {
@@ -33,6 +27,12 @@
 				"navigationBarTitleText": "最近联系人"
 				"navigationBarTitleText": "最近联系人"
 			}
 			}
 		},
 		},
+		{
+			"path": "pages/index/my",
+			"style": {
+				"navigationBarTitleText": "企业"
+			}
+		},
 		{
 		{
 			"path": "pages/addWebView/index",
 			"path": "pages/addWebView/index",
 			"style": {
 			"style": {
@@ -44,168 +44,30 @@
 		{
 		{
 			"root": "pagesA",
 			"root": "pagesA",
 			"pages": [
 			"pages": [
-				{
-					"path": "resumeAnalysis/index",
-					"style": {
-						"navigationBarTitleText": "简历解析"
-					}
-				},
-				{
-					"path": "resumeOnline/index",
-					"style": {
-						"navigationBarTitleText": "在线简历"
-					}
-				},
-				{
-					"path": "resumeOnline/baseInfoEdit",
-					"style": {
-						"navigationBarTitleText": "基本信息"
-					}
-				},
-				{
-					"path": "resumeOnline/portrait",
-					"style": {
-						"navigationBarTitleText": "个人画像标签选择"
-					}
-				},
-				{
-					"path": "resumeOnline/advantage",
-					"style": {
-						"navigationBarTitleText": "个人优势"
-					}
-				},
-				{
-					"path": "resumeOnline/jobIntention",
-					"style": {
-						"navigationBarTitleText": "求职意向"
-					}
-				},
-				{
-					"path": "resumeOnline/educationExp",
-					"style": {
-						"navigationBarTitleText": "教育经历"
-					}
-				},
-				{
-					"path": "resumeOnline/workExperience",
-					"style": {
-						"navigationBarTitleText": "工作经验"
-					}
-				},
-				{
-					"path": "resumeOnline/trainingExperience",
-					"style": {
-						"navigationBarTitleText": "培训经历"
-					}
-				},
-				{
-					"path": "resumeOnline/vocationalSkills",
-					"style": {
-						"navigationBarTitleText": "职业技能"
-					}
-				},
-				{
-					"path": "resume/index",
-					"style": {
-						"navigationBarTitleText": "附件简历"
-					}
-				},
 				{
 				{
 					"path": "student/index",
 					"path": "student/index",
 					"style": {
 					"style": {
 						"navigationBarTitleText": "学生专区"
 						"navigationBarTitleText": "学生专区"
 					}
 					}
 				},
 				},
-				{
-					"path": "student/information",
-					"style": {
-						"navigationBarTitleText": "学生信息"
-					}
-				},
-				{
-					"path": "student/internshipRecord",
-					"style": {
-						"navigationBarTitleText": "实习记录"
-					}
-				},
-				{
-					"path": "student/internshipReport",
-					"style": {
-						"navigationBarTitleText": "实习报告"
-					}
-				},
-				{
-					"path": "student/addReport",
-					"style": {
-						"navigationBarTitleText": "新增实习报告"
-					}
-				},
-				{
-					"path": "student/certificateDetail",
-					"style": {
-						"navigationBarTitleText": "实习证书详情"
-					}
-				},
-				{
-					"path": "student/internshipButler",
-					"style": {
-						"navigationBarTitleText": "实习管家"
-					}
-				},
-				{
-					"path": "collect/index",
-					"style": {
-						"navigationBarTitleText": "我的收藏"
-					}
-				},
 				{
 				{
 					"path": "interview/index",
 					"path": "interview/index",
 					"style": {
 					"style": {
 						"navigationBarTitleText": "面试管理"
 						"navigationBarTitleText": "面试管理"
 					}
 					}
 				},
 				},
-				{
-					"path": "seenMe/index",
-					"style": {
-						"navigationBarTitleText": "谁看过我"
-					}
-				},
-				{
-					"path": "info/index",
-					"style": {
-						"navigationBarTitleText": "个人信息"
-					}
-				},
-				{
-					"path": "recommendation/index",
-					"style": {
-						"navigationBarTitleText": "我的推荐"
-					}
-				},
 				{
 				{
 					"path": "chart/index",
 					"path": "chart/index",
 					"style": {
 					"style": {
 						"navigationBarTitleText": "我的聊天"
 						"navigationBarTitleText": "我的聊天"
 					}
 					}
 				},
 				},
-				{
-					"path": "coupon/index",
-					"style": {
-						"navigationBarTitleText": "我的优惠券"
-					}
-				},
 				{
 				{
 					"path": "balance/index",
 					"path": "balance/index",
 					"style": {
 					"style": {
 						"navigationBarTitleText": "我的余额"
 						"navigationBarTitleText": "我的余额"
 					}
 					}
 				},
 				},
-				{
-					"path": "integral/index",
-					"style": {
-						"navigationBarTitleText": "积分明细"
-					}
-				},
 				{
 				{
 					"path": "vip/index",
 					"path": "vip/index",
 					"style": {
 					"style": {
@@ -217,30 +79,12 @@
 					"style": {
 					"style": {
 						"navigationBarTitleText": "会员套餐"
 						"navigationBarTitleText": "会员套餐"
 					}
 					}
-				},
-				{
-					"path": "vip/template/index",
-					"style": {
-						"navigationBarTitleText": "简历模板"
-					}
-				},
-				{
-					"path": "vip/blockEnt/index",
-					"style": {
-						"navigationBarTitleText": "屏蔽企业"
-					}
 				}
 				}
 			]
 			]
 		},
 		},
 		{
 		{
 			"root": "pagesB",
 			"root": "pagesB",
 			"pages": [
 			"pages": [
-				{
-					"path": "companyDetail/index",
-					"style": {
-						"navigationBarTitleText": "企业详情"
-					}
-				},
 				{
 				{
 					"path": "contactUs/index",
 					"path": "contactUs/index",
 					"style": {
 					"style": {
@@ -253,12 +97,6 @@
 						"navigationBarTitleText": "职位详情"
 						"navigationBarTitleText": "职位详情"
 					}
 					}
 				},
 				},
-				{
-					"path": "inviteRecord/index",
-					"style": {
-						"navigationBarTitleText": "新用户邀请记录"
-					}
-				},
 				{
 				{
 					"path": "agreement/index",
 					"path": "agreement/index",
 					"style": {
 					"style": {
@@ -295,54 +133,6 @@
 						"navigationBarTitleText": "用户行为规范"
 						"navigationBarTitleText": "用户行为规范"
 					}
 					}
 				},
 				},
-				{
-					"path": "recommendEnterprise/index",
-					"style": {
-						"navigationBarTitleText": "精选企业"
-					}
-				},
-				{
-					"path": "sharePoster/index",
-					"style": {
-						"navigationBarTitleText": "我的分享码"
-					}
-				},
-				{
-					"path": "headhunting/index",
-					"style": {
-						"navigationBarTitleText": "门墩儿猎头"
-					}
-				},
-				{
-					"path": "headhunting/pages/details",
-					"style": {
-						"navigationBarTitleText": "门墩儿猎头资质"
-					}
-				},
-				{
-					"path": "headhunting/pages/service",
-					"style": {
-						"navigationBarTitleText": "我们的服务"
-					}
-				},
-				{
-					"path": "headhunting/pages/contact",
-					"style": {
-						"navigationBarTitleText": "联系我们"
-					}
-				},
-				{
-					"path": "about/index",
-					"style": {
-						"navigationBarTitleText": "联系我们"
-					}
-				},
-				{
-					"path": "preferredGroup/index",
-					"style": {
-						"navigationBarTitleText": "优选集团"
-					}
-				},
 				{
 				{
 					"path": "jobFair/index",
 					"path": "jobFair/index",
 					"style": {
 					"style": {
@@ -378,7 +168,7 @@
 	],
 	],
 	"globalStyle": {
 	"globalStyle": {
 		"navigationBarTextStyle": "black",
 		"navigationBarTextStyle": "black",
-		"navigationBarTitleText": "门墩儿",
+		"navigationBarTitleText": "门墩儿招聘",
 		"navigationBarBackgroundColor": "#ffffff",
 		"navigationBarBackgroundColor": "#ffffff",
 		"backgroundColor": "#ffffff"
 		"backgroundColor": "#ffffff"
 	},
 	},
@@ -388,8 +178,8 @@
 		"borderStyle": "black",
 		"borderStyle": "black",
 		"backgroundColor": "#ffffff",
 		"backgroundColor": "#ffffff",
 		"height": "65px",
 		"height": "65px",
-		"fontSize": "24rpx",
 		"custom": true,
 		"custom": true,
+		"fontSize": "24rpx",
 		"list": [
 		"list": [
 			{
 			{
 				"pagePath": "pages/index/resume",
 				"pagePath": "pages/index/resume",
@@ -409,18 +199,6 @@
 				"iconPath": "/static/img/message.png",
 				"iconPath": "/static/img/message.png",
 				"selectedIconPath": "/static/img/message-fill.png"
 				"selectedIconPath": "/static/img/message-fill.png"
 			},
 			},
-			{
-				"pagePath": "pages/index/welfare",
-				"text": "会员福利",
-				"iconPath": "/static/img/welfare.png",
-				"selectedIconPath": "/static/img/welfare.png"
-			},
-			{
-				"pagePath": "pages/index/crowdsourcing",
-				"text": "赏金",
-				"iconPath": "/static/img/pin.png",
-				"selectedIconPath": "/static/img/pin-fill.png"
-			},
 			{
 			{
 				"pagePath": "pages/index/my",
 				"pagePath": "pages/index/my",
 				"text": "企业",
 				"text": "企业",

+ 1 - 1
pages/index/communicate.vue

@@ -80,7 +80,7 @@ onShow(() => {
 	const currentTabBar = currentPage?.getTabBar?.();
 	const currentTabBar = currentPage?.getTabBar?.();
 
 
 	// 设置当前tab页的下标index
 	// 设置当前tab页的下标index
-	currentTabBar?.setData({ selected: 1 });
+	currentTabBar?.setData({ selected: 2 });
 	init()
 	init()
 })
 })
 onLoad(() => {
 onLoad(() => {

+ 0 - 305
pages/index/crowdsourcing.vue

@@ -1,305 +0,0 @@
-<template>
-  <layout-page>
-		<view class="content defaultBgc">
-			<view class="content-top">
-				<view class="content-top-title">
-					<view class="content-top-title-label">
-						<text class="content-top-title-label-l">全员猎寻</text>
-						<text class="content-top-title-label-s">海量岗位 | 推荐有赏</text>
-					</view>
-				</view>
-			</view>
-			<scroll-view class="scrollBox" scroll-y="true" @scrolltolower="loadingMore" style="position:relative;">
-				<view class="content-top">
-					<view v-if="swiperAdList.length" class="content-top-carousel">
-						<view class="content-top-carousel-box">
-							<SwiperAd :list="swiperAdList" imgUrlKey="img" :strType="false" @click="handleToDetails"></SwiperAd>
-						</view>
-					</view>
-					<view class="content-top-recommend" :class="{'ss-m-t-20': !swiperAdList.length}">
-						<view class="content-top-recommend-box">
-							<resume-status>
-								<template #header>
-									<view class="content-top-recommend-box-title">
-										<text class="title">我的推荐</text>
-									</view>
-								</template>
-							</resume-status>
-						</view>
-					</view>
-				</view>
-				<view class="content-main">
-					<view class="content-main-list">
-						<PositionList :list="items" :noMore="false"></PositionList>
-						<uni-load-more :status="more" />
-					</view>
-				</view>
-			</scroll-view>
-		</view>
-  </layout-page>
-</template>
-
-<script setup>
-import { ref, reactive } from 'vue'
-import SwiperAd from '@/components/SwiperAd'
-import layoutPage from '@/layout'
-import ResumeStatus from '@/components/ResumeStatus'
-import { getJobAdvertisedHire } from '@/api/position.js'
-import { dealDictArrayData } from '@/utils/position.js'
-import PositionList from '@/components/PositionList'
-import { getWebContent } from '@/api/common'
-import { formatName } from '@/utils/getText'
-import { onShow, onLoad, onShareAppMessage, onShareTimeline } from '@dcloudio/uni-app'
-// 设置自定义tabbar选中值
-onShow(() => {
-    const currentPage = getCurrentPages()[0];  // 获取当前页面实例
-    const currentTabBar = currentPage?.getTabBar?.();
-
-    // 设置当前tab页的下标index
-    currentTabBar?.setData({ selected: 3 });
-})
-
-// 获取轮播图
-const swiperAdList = ref([])
-const getSystemWebContent = async () => {
-  const { data } = await getWebContent()
-  swiperAdList.value = data.appHomeCarousel || []
-}
-getSystemWebContent()
-
-const items = reactive([])
-const pageInfo = ref({
-	pageNo: 1,
-	pageSize: 20
-})
-
-const loading = ref(false)
-const total = ref(0)
-
-const more = ref('more')
-
-// 跳转企业详情
-const handleToDetails = ({ link, title }) => {
-	if (link) {
-		uni.navigateTo({ url: `/pages/addWebView/index?url=${link}&title=${title || '风尚榜奖投票'}` })
-	}
-}
-
-onLoad(() => {
-	getList()
-  wx.showShareMenu({
-    withShareTicket: true,
-    menus: ['shareAppMessage', 'shareTimeline']
-  })
-  onShareAppMessage(() => {
-    return {
-      title: '门墩儿 专注顶尖招聘',
-      path: '/pages/index/position',
-			imageUrl: '../../static/img/share-poster.jpg'
-    }
-  })
-	onShareTimeline(() => {
-		return {
-			title: '门墩儿 专注顶尖招聘',
-			path: '/pages/index/position',
-			imageUrl: '../../static/img/share-poster.jpg'
-		}
-	})
-})
-
-const loadingMore = (e) => {
-	if (total.value === items.length) {
-		return
-	}
-	if (loading.value) {
-		return
-	}
-	more.value = 'loading'
-	pageInfo.value.pageNo++
-	getList()
-}
-
-async function getList () {
-	loading.value = true
-	try {
-		const { data } = await getJobAdvertisedHire({
-			...pageInfo.value
-		})
-		if (!data?.list) {
-			pageInfo.pageNo--
-			return
-		}
-		const _items = dealDictArrayData([], data.list)
-		items.push(..._items.map(e => {
-			return {
-				job: e,
-				enterprise: {
-					welfareList: e.tagList,
-					logoUrl: e.logoUrl,
-					anotherName: formatName(e.anotherName || e.name),
-					industryName: e.industryName,
-					scaleName: e.scaleName
-				}
-			}
-		}))
-		total.value = +data.total
-		more.value = items.length === total.value ? 'noMore' : 'more'
-	} catch (error) {
-		more.value = more
-		pageInfo.pageNo--
-	} finally {
-		loading.value = false
-	}
-	
-}
-
-
-</script>
-
-<style scoped lang="scss">
-$defaultColor: #999;
-@mixin box {
-	// border-radius: 24rpx;
-	width: 100%;
-	height: 100%;
-	background: #FFF;
-	overflow: hidden;
-}
-.content {
-	height: 100vh;
-	display: flex;
-	flex-direction: column;
-	&-top {		
-		&-title {
-			padding: 24rpx;
-			box-sizing: border-box;
-			width: 100%;
-			display: flex;
-			justify-content: space-between;
-			align-items: flex-end;
-			background-color: #FFF;
-			&-label {
-				display: flex;
-				align-items: flex-end;
-				&-l {
-					font-size: 46rpx;
-					margin-right: 16rpx;
-				}
-				&-s {
-					font-size: 24rpx;
-					color: $defaultColor;
-				}
-			}
-			&-local {
-				color: $defaultColor;
-				display: flex;
-				align-items: flex-end;
-			}
-		}
-		// &-carousel {
-		// 	padding: 24rpx;
-		// }
-		&-recommend {
-			padding: 0 24rpx;
-			&-box {
-				@include box;
-				&-title {
-					display: flex;
-					justify-content: space-between;
-					align-items: flex-end;
-					padding: 20rpx;
-					font-size: 30rpx;
-					.route {
-						color: $defaultColor;
-						font-size: .75em;
-					}
-				}
-			}
-		}
-	}
-	&-main {
-		&-filter {
-			padding: 24rpx;
-			font-size: 30rpx;
-			color: $defaultColor;
-			display: flex;
-			justify-content: space-between;
-			&-type{
-				&-item {
-					padding: 20rpx;
-					&.active {
-						color: #000;
-					}
-				}
-			}
-		}
-		&-list {
-			width: 100%;
-			// padding: 0 24rpx 24rpx 24rpx;
-			box-sizing: border-box;
-			&-box {
-				padding: 24rpx;
-				margin-bottom: 24rpx;
-				box-sizing: border-box;
-				@include box;
-				.top {
-					width: 100%;
-					display: flex;
-					justify-content: space-between;
-					.title {
-						flex: 1;
-						overflow: hidden; /* 隐藏超出部分 */  
-						white-space: nowrap; /* 不换行 */  
-						text-overflow: ellipsis; /* 超出部分显示省略号 */  
-					}
-					.remuneration {
-						color: aquamarine;
-					}
-				}
-				.main {
-					display: flex;
-					font-size: 24rpx;
-					margin: 28rpx 0;
-					.tag {
-						&.blue {
-							background: aliceblue;
-							color: royalblue;
-						}
-						font-size: 20rpx;
-						border-radius: 8rpx;
-						color: #666;
-						background: #eee;
-						padding: 6rpx 10rpx;
-						margin-right: 20rpx;
-					}
-				}
-				.bottom {
-					color: #666;
-					display: flex;
-					justify-content: space-between;
-					.origin {
-						font-size: 0.8em;
-						.interval {
-							padding: 0 16rpx;
-						}
-					}
-					.local {
-						color: #aaa;
-						font-size: 0.6em;
-					}
-				}
-			}
-			.noMore {
-				font-size: 24rpx;
-				color: $defaultColor;
-				text-align: center;
-			}
-		}
-	}
-}
-.scrollBox {
-	height: 0;
-	flex: 1;
-	padding-bottom: 120rpx;
-}
-</style>

+ 1 - 28
pages/index/my.vue

@@ -86,7 +86,7 @@ onShow(() => {
     const currentTabBar = currentPage?.getTabBar?.();
     const currentTabBar = currentPage?.getTabBar?.();
 
 
     // 设置当前tab页的下标index
     // 设置当前tab页的下标index
-    currentTabBar?.setData({ selected: 4 });
+    currentTabBar?.setData({ selected: 3 });
 })
 })
 
 
 // showAuthModal('') //测试 selectUserType
 // showAuthModal('') //测试 selectUserType
@@ -267,33 +267,6 @@ const handleShareCode = async () => {
 	shareQrCodePopup.value.open()
 	shareQrCodePopup.value.open()
 }
 }
 
 
-// 保存到本地
-// const handleSaveShareUrl = async () => {
-// 	const fsm = wx.getFileSystemManager()
-// 	const data = shareUrl.value
-// 	if (!data) return
-// 	fsm.writeFile({
-// 		filePath:wx.env.USER_DATA_PATH+'/MySharingCode.png',
-// 		data: data.slice(22),
-// 		encoding:'base64',
-// 		success: res => {
-// 			wx.saveImageToPhotosAlbum({
-// 				filePath: wx.env.USER_DATA_PATH + '/MySharingCode.png',
-// 				success: function (res) {
-// 					wx.showToast({
-// 						title: '保存成功',
-// 					})
-// 				},
-// 				fail: function (err) {
-// 					console.log(err)
-// 				}
-// 			})
-// 		}, fail: err => {
-// 			console.log(err)
-// 		}
-// 	})
-// }
-
 // 登录
 // 登录
 const handleTap = () => {
 const handleTap = () => {
 	if (!useUserStore.isLogin) {
 	if (!useUserStore.isLogin) {

+ 10 - 0
pages/index/position.vue

@@ -16,6 +16,16 @@
 
 
 <script setup>
 <script setup>
 import { ref } from 'vue'
 import { ref } from 'vue'
+import { onShow } from '@dcloudio/uni-app'
+
+// 设置自定义tabbar选中值
+onShow(() => {
+  const currentPage = getCurrentPages()[0] // 获取当前页面实例
+  const currentTabBar = currentPage?.getTabBar?.()
+
+  // 设置当前tab页的下标index
+  currentTabBar?.setData({ selected: 1 })
+})
 
 
 const current = ref(0)
 const current = ref(0)
 const controlList = ['招聘中', '已关闭']
 const controlList = ['招聘中', '已关闭']

+ 12 - 1
pages/index/resume.vue

@@ -1,8 +1,19 @@
 <template>
 <template>
-  <view>resume</view>
+    <!-- <layout-page>企业-简历</layout-page> -->
 </template>
 </template>
 
 
 <script setup>
 <script setup>
+	import layoutPage from '@/layout'
+	import { onShow } from '@dcloudio/uni-app'
+	
+	// 设置自定义tabbar选中值
+	onShow(() => {
+	    const currentPage = getCurrentPages()[0];  // 获取当前页面实例
+	    const currentTabBar = currentPage?.getTabBar?.();
+	
+	    // 设置当前tab页的下标index
+	    currentTabBar?.setData({ selected: 0 });
+	})
 </script>
 </script>
 
 
 <style scoped lang="scss">
 <style scoped lang="scss">

+ 0 - 82
pagesA/collect/company.vue

@@ -1,82 +0,0 @@
-<template>
-  <view class="ss-m-x-20">
-    <scroll-view class="scrollBox" scroll-y="true" @scrolltolower="loadingMore" style="height: 100vh;">
-      <view v-if="items.length">
-        <view v-for="(item, index) in items" :key="index" class="ss-m-t-20" @click="jumpToEnterpriseDetail(item.id)">
-          <view style="background-color: #fff; border-radius: 12px;" class="ss-p-30">
-            <view class="d-flex align-center">
-              <image :src="item.logoUrl || 'https://minio.citupro.com/dev/menduner/company-avatar.png'" style="width: 50px; height: 50px; object-fit: contain"></image>
-              <view style="flex: 1;" class="ss-m-l-30">
-                <view class="enterprise-name ellipsis">{{ formatName(item.anotherName || item.name) }}</view>
-                <view class="ss-m-y-15 font-size-12">
-                  <span class="tag-gap color-666">
-                    <span>{{item.industryName }}</span>
-                    <span class="ss-m-x-10" v-if="item.scaleName">|</span>
-                    <span>{{item.scaleName }}</span>
-                  </span>
-                </view>
-                <view>
-                  <uni-tag 
-                    v-for="(tag, i) in item.tagList || []"
-                    :key="i"
-                    class="ss-m-r-10"
-                    :text="tag"
-                    inverted="false"
-                    size="mini"
-                    custom-style="background-color: #eef1f7;color:#7f828b;border-color:#eef1f7;"
-                  />
-                </view>
-              </view>
-            </view>
-          </view>
-        </view>
-        <uni-load-more :status="status" />
-      </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>
-    </scroll-view>
-  </view>
-</template>
-
-<script setup>
-import { ref } from 'vue'
-import { getSubscribeEnterprise } from '@/api/user'
-import { dealDictArrayData, jumpToEnterpriseDetail } from '@/utils/position'
-import { formatName } from '@/utils/getText'
-
-const items = ref([])
-const status = ref('more')
-const queryParams = ref({
-  pageSize: 10,
-  pageNo: 1
-})
-
-const getList = async () => {
-  const { data } = await getSubscribeEnterprise(queryParams.value)
-  let list = data?.list || []
-  if (list?.length) {
-    list = dealDictArrayData([], list)
-    items.value = items.value.concat(list)
-  }
-  status.value = items.value?.length === +data.total ? 'noMore' : 'more'
-}
-getList()
-
-// 加载更多
-const loadingMore = () => {
-  status.value = 'loading'
-  queryParams.value.pageNo++
-  getList()
-}
-</script>
-
-<style scoped lang="scss">
-.enterprise-name {
-  color: #333;
-  font-weight: bold;
-  font-size: 16px;
-  width: 70vw;
-  max-width: 70vw;
-}
-</style>

+ 0 - 26
pagesA/collect/index.vue

@@ -1,26 +0,0 @@
-<template>
-  <view class="defaultBgc">
-    <uni-segmented-control :current="current" :values="controlList" @clickItem="handleChange" styleType="text" activeColor="#00B760" style="background-color: #fff;"></uni-segmented-control>
-    <Position v-if="current === 0"></Position>
-    <Company v-else></Company>
-  </view>
-</template>
-
-<script setup>
-import { ref } from 'vue'
-import Position from './position.vue'
-import Company from './company.vue'
-
-const current = ref(0)
-const controlList = ['职位', '企业']
-
-const handleChange = (e) => {
-  current.value = e.currentIndex
-}
-</script>
-
-<style scoped lang="scss">
-:deep(.segmented-control) {
-  background-color: #fff !important;
-}
-</style>

+ 0 - 51
pagesA/collect/position.vue

@@ -1,51 +0,0 @@
-<template>
-  <view class="defaultBgc">
-    <scroll-view class="scrollBox" scroll-y="true" @scrolltolower="loadingMore" style="height: 100vh;">
-      <view v-if="items.length">
-        <PositionList class="pb-10" :list="items" :noMore="false"></PositionList>
-        <uni-load-more :status="status" />
-      </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>
-    </scroll-view>
-  </view>
-</template>
-
-<script setup>
-import { ref } from 'vue'
-import { getJobFavoriteList } from '@/api/user'
-import { dealDictObjData } from '@/utils/position'
-import PositionList from '@/components/PositionList'
-
-const status = ref('more')
-const queryParams = ref({
-  pageSize: 10,
-  pageNo: 1
-})
-const items = ref([])
-
-const getList = async () => {
-  const { data } = await getJobFavoriteList(queryParams.value)
-  const list = data?.list || []
-  if (list?.length) {
-    list.forEach(e => {
-      e.job = { ...e.job, ...dealDictObjData({}, e.job) }
-      e.enterprise = { ...e.enterprise, ...dealDictObjData({}, e.enterprise)}
-    })
-    items.value = items.value.concat(list)
-  }
-  status.value = items.value?.length === +data.total ? 'noMore' : 'more'
-}
-getList()
-
-const loadingMore = () => {
-  status.value = 'loading'
-  queryParams.value.pageNo++
-  getList()
-}
-</script>
-
-<style scoped lang="scss">
-
-</style>

+ 0 - 198
pagesA/coupon/index.vue

@@ -1,198 +0,0 @@
-<template>
-  <layout-page>
-    <scroll-view class="scrollBox" scroll-y="true" @scrolltolower="loadingMore">
-      <view class="defaultBgc content">
-        <view
-          v-for="item in items"
-          :key="item.id"
-          class="content-item"
-          :class="{ used: item.status === 2, disabled: item.status === 3 }"
-        >
-          <view class="msg">
-            <view class="item">
-              <view class="name">{{ item.name }}</view>
-              <view class="price">
-                <uni-icons color="#f30" type="icon-renminbi1688" size="16" custom-prefix="iconfont"></uni-icons>
-                {{ item.price }}
-              </view>
-            </view>
-            <view class="item">
-              <view class="desc">有效期:{{ item.legalTime }}</view>
-              <view class="desc">满 {{ item.used }} 可用</view>
-            </view>
-          </view>
-          <view class="use">
-            <button
-            class="btn"
-            :class="{ disabled: item.status !== 1 }"
-            @tap="handleTo(item.status)"
-            >{{ item.status === 1 ? '立即使用' : item.status === 2 ? '已使用' : '已过期'}}</button>
-          </view>
-        </view>
-        <uni-load-more :status="more" />
-      </view>
-    </scroll-view>
-  </layout-page>
-</template>
-
-<script setup>
-import { ref } from 'vue'
-import {
-  getCouponPage
-} from '@/api/sign'
-import { timesTampChange } from '@/utils/date'
-
-
-const pageInfo = ref({
-  pageNo:1,
-  pageSize: 20
-})
-const total = ref(0)
-const items = ref([])
-const more = ref('more')
-
-getMyCoupon()
-
-async function getMyCoupon () {
-  try {
-    const { data } = await getCouponPage({ ...pageInfo.value })
-    if (!data || !data.list || !data.list.length) {
-      if (pageInfo.value.pageNo === 1) {
-        more.value = 'more'
-        return
-      }
-      pageInfo.value.pageNo--
-      more.value = 'more'
-      return
-    }
-    items.value.push(...data.list.map(e => {
-      return {
-        ...e,
-        price: (e.discountPrice / 100).toFixed(2),
-        legalTime: timesTampChange(e.validStartTime, 'Y-M-D') + ' 至 ' + timesTampChange(e.validEndTime, 'Y-M-D'),
-        used: (e.usePrice / 100).toFixed(2)
-      }
-    }))
-    total.value = +data.total
-    more.value = items.value.length >= total.value ? 'noMore' : 'more'
-  } catch (error) {
-    if (pageInfo.value.pageNo === 1) {
-      more.value = 'more'
-      return
-    }
-    pageInfo.value.pageNo--
-    more.value = 'more'
-  }
-}
-
-function handleTo (status) {
-  if (status !== 1) {
-    return
-  }
-  wx.navigateToMiniProgram({  
-    appId: 'wx6decdf12f9e7a061', // 目标小程序的 appId
-    // envVersion: 'develop',
-    success(res) {  
-        // 打开成功  
-        console.log('成功跳转至小程序:', res);  
-    },  
-    fail(err) {  
-        // 打开失败
-        uni.showToast({
-          title: '打开商城失败',
-          icon: 'none'
-        })
-    }  
-  })
-}
-
-function loadingMore () {
-  if (more.value === 'noMore') {
-    return
-  }
-  more.value = 'loading'
-  pageInfo.value.pageNo++
-  getMyCoupon()
-}
-</script>
-
-<style lang="scss" scoped>
-.content {
-  // height: 100vh;
-  width: 100vw;
-  padding: 20rpx;
-  box-sizing: border-box;
-  &-item {
-    margin-bottom: 20rpx;
-    .msg {
-      background: #FFF;
-      padding: 40rpx;
-      box-sizing: border-box;
-      -webkit-mask: radial-gradient(circle at 0.375rem 100%, #00000000 0.375rem, red 0) -0.375rem;
-      position: relative;
-      &::after {
-        content: '';
-        position: absolute;
-        bottom: 0;
-        right: 0.375rem;
-        width: calc( 100% - 0.75rem);
-        height: 0;
-        border-top: 2rpx dashed #eee;
-      }
-    }
-    .use {
-      background: #FFF;
-      padding: 20rpx;
-      box-sizing: border-box;
-      display: flex;
-      justify-content: flex-end;
-      font-size: .85em ;
-      -webkit-mask: radial-gradient(circle at 0.375rem 0%, #0000 0.375rem, red 0) -0.375rem;
-      .btn {
-        margin: 0;
-        position: relative;
-        border: 0;
-        display: flex;
-        align-items: center;
-        justify-content: center;
-        box-sizing: border-box;
-        text-align: center;
-        text-decoration: none;
-        white-space: nowrap;
-        vertical-align: baseline;
-        transform: translate(0, 0);
-        padding: 0 0.5rem;
-        height: 1.5625rem;
-        width: 200rpx;
-        border-radius: 1.25rem;
-        background: linear-gradient(90deg, #ff3000, rgba(255, 48, 0, 0.6));
-        color: #ffffff;
-        font-size: 0.75rem;
-        font-weight: 400;
-        &.disabled {
-          background: rgba(130, 130, 130, 0.5);
-        }
-      }
-    }
-    .item {
-      display: flex;
-      align-items: center;
-      justify-content: space-between;
-      margin-bottom: 20rpx;
-      .name {
-        font-weight: bolder;
-        font-size: 36rpx;
-      }
-      .price {
-        color: #f30;
-        font-size: 54rpx;
-      }
-      .desc {
-        color: #999;
-        font-size: 24rpx;
-      }
-      
-    }
-  }
-}
-</style>

+ 0 - 175
pagesA/integral/index.vue

@@ -1,175 +0,0 @@
-<template>
-  <layout-page>
-    <view class="box defaultBgc">
-      <scroll-view class="scrollBox" scroll-y="true" @scrolltolower="loadingMore">
-        <view>
-          <view class="panel">
-            <view>
-              <!-- <uni-icons color="#f30" type="icon-renminbi1688" size="16" custom-prefix="iconfont"></uni-icons> -->
-              <text class="text">{{ balance.point }}</text>
-            </view>
-            <view>
-              <button class="btn" @tap="handleUse">积分兑换</button>
-            </view>
-          </view>
-          <view class="list">
-            <uni-list>
-              <uni-list-item
-                v-for="item in items"
-                :key="item.id"
-                :title="item.description"
-                :rightText="item._createTime"
-              />
-            </uni-list>
-            <uni-load-more :status="more" />
-          </view>
-        </view>
-      </scroll-view>
-
-      <uni-popup ref="inputDialog" type="dialog">
-        <view class="shareQrCodePopupContent">
-          <view class="ss-m-b-10">请前往网页版门墩儿商城查看</view>
-          <uni-link href="https://www.menduner.com/mall" text="点击复制网页地址" color="#00B760" fontSize="16" copyTips="已复制,请在电脑端打开"></uni-link>
-        </view>
-      </uni-popup>
-    </view>
-  </layout-page>
-</template>
-<!-- balance 余额 -->
-<script setup>
-import { ref } from 'vue'
-import {
-  getUserAccount,
-  getEnterpriseAccountRecordPage
-} from '@/api/sign'
-import { timesTampChange } from '@/utils/date'
-
-const balance = ref({})
-
-const items = ref([])
-const pageInfo = ref({
-  pageNo: 1,
-  pageSize: 20
-})
-const total = ref(0)
-const more = ref('more')
-const inputDialog = ref()
-
-getBalance()
-getList()
-// 获取积分余额
-async function getBalance() {
-  const { data } = await getUserAccount()
-  if (!data) {
-    return
-  }
-  balance.value = data
-}
-
-async function getList () {
-  try {
-    const { data } = await getEnterpriseAccountRecordPage({ ...pageInfo.value, type: 0 })
-    if (!data || !data.list) {
-      if (pageInfo.value.pageNo === 1) {
-        return
-      }
-      pageInfo.value.pageNo--
-      more.value = 'more'
-      return
-    }
-    const _data = data.list.map(e => {
-      return {
-        ...e,
-        _createTime: timesTampChange(e.createTime)
-      }
-    })
-    items.value.push(..._data)
-    total.value = +data.total
-    more.value = total.value <= items.value.length ? 'noMore' : 'more'
-  } catch (error) {
-    if (pageInfo.value.pageNo === 1) {
-      return
-    }
-    pageInfo.value.pageNo--
-    more.value = 'more'
-  }
-}
-function loadingMore () {
-  if (more.value === 'noMore') {
-    return
-  }
-  more.value = 'loading'
-  pageInfo.value.pageNo++
-  getList()
-}
-
-function handleUse () {
-  // wx.navigateToMiniProgram({  
-  //   appId: 'wx6decdf12f9e7a061', // 目标小程序的 appId
-  //   // envVersion: 'develop',
-  //   success(res) {  
-  //       // 打开成功  
-  //       console.log('成功跳转至小程序:', res);  
-  //   },  
-  //   fail(err) {  
-  //       // 打开失败
-  //       uni.showToast({
-  //         title: '打开商城失败',
-  //         icon: 'none'
-  //       })
-  //   }  
-  // })
-  inputDialog.value.open()
-}
-
-</script>
-
-<style lang="scss" scoped>
-.box {
-  height: 100vh;
-}
-.scrollBox {
-  width: 100vw;
-  // padding: 20rpx;
-  box-sizing: border-box;
-  .panel {
-    position: sticky;
-    z-index: 2;
-    top: 0;
-    width: 100%;
-    padding: 20rpx;
-    margin-bottom: 20rpx;
-    box-sizing: border-box;
-    background: #FFF;
-    display: flex;
-    justify-content: space-between;
-    align-items: flex-end;
-    box-shadow: 0px 0px 10px 0px rgb(0, 0, 0, 0.25);
-    .text {
-      color: #F30;
-      font-size: 54rpx;
-
-    }
-    .btn {
-      width: 180rpx;
-      height: 60rpx;
-      line-height: 60rpx;
-      font-size: 28rpx;
-      text-align: center;
-      background: #00B760;
-      color: #FFF;
-      border-radius: 30rpx;
-    }
-  }
-  .list {
-    // padding: 20rpx;
-  }
-}
-.shareQrCodePopupContent {
-	width: 75vw;
-	padding: 40rpx;
-	margin-bottom: 20rpx;
-	text-align: center;
-	background-color: #fff;
-}
-</style>

+ 0 - 123
pagesA/recommendation/index.vue

@@ -1,123 +0,0 @@
-<template>
-	<layout-page>
-		<uni-segmented-control :current="current" :values="controlListText" @clickItem="handleChange" styleType="text" activeColor="#00B760"></uni-segmented-control>
-		<scroll-view class="scrollBox defaultBgc" scroll-y="true" @scrolltolower="loadingMore" style="height: calc(100vh - 72rpx);">
-		  <view v-if="items.length" class="listBox">
-		    <m-list :items="items"></m-list>
-		    <uni-load-more :status="more" />
-		  </view>
-		  <view v-else class="nodata-img-parent">
-		    <image
-					src="https://minio.citupro.com/dev/static/nodata.png"
-					mode="widthFix"
-					style="width: 100vw"
-				></image>
-		  </view>
-		</scroll-view>
-	</layout-page>
-</template>
-
-<script setup>
-import { ref, watch } from 'vue'
-import layoutPage from '@/layout'
-
-import MList from './list'
-import { getDict } from '@/hooks/useDictionaries.js'
-import { getRecommendationList } from '@/api/position.js'
-import { onLoad } from '@dcloudio/uni-app'
-
-import { userStore } from '@/store/user'
-const useUserStore = userStore()
-
-watch(() => useUserStore.refreshToken, (newVal, oldVal) => {
-  if (useUserStore.refreshToken) {
-		// 监听登录状态
-		console.log('重新登录了')
-		handleChange({ currentIndex: current.value })
-	}
-})
-
-
-const current = ref(0)
-
-// 获取参数
-const controlList = ref([])
-const controlListText = ref([])
-const pageInfo = ref({
-	pageNo: 1,
-	pageSize: 10
-})
-const total = ref(0)
-const items = ref([])
-const loading = ref(false)
-const more = ref('more')
-
-async function initDict () {
-	try {
-		const { data } = await getDict('menduner_hire_job_cv_status')
-		if (!data?.data) {
-			return
-		}
-		controlList.value = data.data
-		controlListText.value = data.data.map(e => e.label)
-		// current.value = +controlList.value[0].value
-		init()
-	} catch (error) {
-		// console.log(error)
-	}
-}
-
-
-function handleChange (val) {
-	current.value = val.currentIndex
-	pageInfo.value.pageNo = 1
-	total.value = 0
-	items.value = []
-	init()
-}
-
-function loadingMore () {
-	if (total.value === items.value.length) {
-		return
-	}
-	if (loading.value) {
-		return
-	}
-	more.value = 'loading'
-  pageInfo.value.pageNo++
-	init()
-}
-
-async function init () {
-	try {
-		loading.value = true
-		const { data } = await getRecommendationList({
-			...pageInfo.value,
-			status: current.value
-		})
-		if (!data?.list) {
-			pageInfo.value.pageNo--
-			return
-		}
-		items.value.push(...data.list)
-		total.value = +data.total
-		more.value = items.value.length === total.value ? 'noMore' : 'more'
-	} catch (error) {
-		pageInfo.value.pageNo--
-	} finally {
-		loading.value = false
-	}
-}
-
-onLoad(async (options) => {
-  if (options?.id) {
-    current.value = +options.id
-	}
-	initDict()
-})
-
-</script>
-
-<style lang="scss" scoped>
-
-</style>

+ 0 - 70
pagesA/recommendation/list.vue

@@ -1,70 +0,0 @@
-<template>
-	<view>
-		<view
-			class="list ss-m-x-15"
-			v-for="item in items"
-			:key="item.id"
-		>
-			<view class="list-top">
-				<text class="list-top-person">牛人:{{ item.sendPerson?.name }}</text>
-				<text class="list-top-time">{{ timesTampChange(item.createTime) }}</text>
-			</view>
-			<view class="list-remuneration">
-				薪酬:
-				<span v-if="item.job?.payFrom && item.job?.payTo">{{ item.job?.payFrom + '-' + item.job?.payTo }}</span>
-				<span v-else>面议</span>
-			</view>
-			<view class="list-company" style="border-radius: 0 0 12px 12px;">
-				<text>{{ formatName(item.enterprise?.anotherName || item.enterprise?.name) }}</text>
-				<text>{{ item.enterprise?.anotherName && item.job?.name ? ' · ' : '' }}</text>
-				<text>{{ formatName(item.job?.name) }}</text>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script setup>
-import { timesTampChange } from '@/utils/date'
-import { formatName } from '@/utils/getText'
-
-const props = defineProps({
-	items: {
-		type: Array,
-		default: () => []
-	}
-})
-</script>
-
-<style lang="scss" scoped>
-.list {
-	background: #fff;
-	margin-top: 20rpx;
-	border-radius: 12px;
-	&-top {
-		padding: 20rpx;
-		display: flex;
-		justify-content: space-between;
-		align-items: center;
-		&-person {
-			font-size: .9em;
-			color: #333;
-		}
-		&-time {
-			font-size: .75em;
-			color: #999;
-		}
-	}
-	&-company {
-		padding: 30rpx 20rpx;
-		font-size: 28rpx;
-		color: #666;
-		background: linear-gradient(90deg, #f5fcfc 0, #fcfbfa 100%);
-	}
-	&-remuneration {
-		padding: 20rpx;
-		font-size: 28rpx;
-		color: #666;
-	}
-	
-}
-</style>

+ 0 - 93
pagesA/resumeAnalysis/components/advantage.vue

@@ -1,93 +0,0 @@
-<template>
-	<view class="f-straight wrapper">
-		<uni-forms ref="form" :modelValue="formData" :rules="rules" validateTrigger="bind" label-width="105px" label-align="right">
-      <uni-forms-item label="个人优势" name="advantage" required>
-        <textarea
-          placeholder-style="color:#F76260"
-          placeholder="请填写您的个人优势..."
-          auto-focus
-          maxlength="300"
-          v-model="formData.advantage"
-          style="border: 1rpx solid gray; width: 100%; min-height: 300px;"
-        ></textarea>
-			</uni-forms-item>
-		</uni-forms>
-	</view>
-</template>
-
-<script setup>
-import { ref, watch, unref } from 'vue'
-const props = defineProps({
-  id: {
-    type: String,
-    default: ''
-  },
-  text: {
-    type: String,
-    default: ''
-  },
-  data: {
-    type: String,
-    default: ''
-  }
-})
-
-const form = ref()
-const formData = ref({ advantage:'' })
-
-watch(
-  () => props.data,
-  (newVal) => {
-    formData.value.advantage = newVal
-  },
-  { immediate: true },
-)
-
-
-const rules = {
-	advantage:{
-		rules: [{required: true, errorMessage: '请上传头像' }]
-	}
-}
-
-const submit = async () => {
-  try {
-    const valid = await unref(form).validate()
-    // if (!valid) return { id: props.id, data: null}
-    return { id: props.id, data: { content: formData.value.advantage }}
-  } catch (error) {
-    return { text: props.text }
-  }
-}
-
-defineExpose({
-  id: props.id,
-  submit
-})
-
-</script>
-
-<style lang="less" scoped>
-
-.wrapper{
-	padding: 15px;
-  padding-top: 30px;
-}
-.upload-img{
-  position: relative;
-  width: 200rpx;
-  height: 200rpx;
-  border: 1px solid #f1f1f1;
-  margin: 10rpx;
-}
-.upload-file{
-  width: 200rpx;
-  height: 200rpx;
-  border: 1px solid #f1f1f1;
-  margin: 10rpx;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  border-radius: 10rpx;
-}
-</style>

+ 0 - 119
pagesA/resumeAnalysis/components/avatarEdit.vue

@@ -1,119 +0,0 @@
-<template>
-	<view class="f-straight wrapper">
-		<uni-forms ref="form" :modelValue="formData" :rules="rules" validateTrigger="bind" label-width="105px" label-align="right">
-			<uni-forms-item label="头像" name="avatar" class="f-straight" required>
-        <view style="display: flex;flex-wrap: wrap;">
-          <view class="upload-img" v-if="formData?.avatar">
-            <uni-icons size="35" type="clear" color="#fe574a" style="position: absolute;right: -15px; top: -15px; z-index: 9" @click="formData.avatar = ''"></uni-icons>
-            <image :src="formData?.avatar" mode="contain" style="width: 200rpx;height: 200rpx;" @click="handlePreviewImage"></image>
-          </view>
-          <view v-else class="upload-file" @click="uploadPhotos">
-            <uni-icons type="plusempty" size="50" color="#f1f1f1"></uni-icons>
-          </view>
-        </view>
-			</uni-forms-item>
-		</uni-forms>
-	</view>
-</template>
-
-<script setup>
-import { pathToBase64 } from '@/utils/image-tools.js'
-import { ref, watch } from 'vue'
-const props = defineProps({
-  id: {
-    type: String,
-    default: ''
-  },
-  text: {
-    type: String,
-    default: ''
-  },
-  data: {
-    type: String,
-    default: ''
-  }
-})
-
-const form = ref()
-const formData = ref({ avatar:'' })
-
-watch(
-  () => props.data,
-  (newVal) => {
-    formData.value.avatar = newVal
-  },
-  { immediate: true },
-)
-
-// 图片预览
-const handlePreviewImage = () => {
-  uni.previewImage({
-    current: 0,
-    urls: [formData.value.avatar]
-  })
-}
-
-// 选择头像
-const uploadPhotos = () => {
-  wx.chooseImage({
-    count: 1,
-    sizeType: ['original', 'compressed'],
-    sourceType: ['album', 'camera'],
-    async success(res) {
-      console.log('res:', res)
-      const size = res.tempFiles[0]?.size || 0
-      if (size >= 31457280) {
-        uni.showToast({
-          icon: 'none',
-          title: '头像上传大小不得超过 20MB !',
-          duration: 2000
-        })
-        return
-      }
-      // 选取图片并转为base64
-      formData.value.avatar = await pathToBase64(res.tempFilePaths[0])
-    }
-  })
-}
-
-const rules = {
-	avatar:{
-		rules: [{required: true, errorMessage: '请上传头像' }]
-	}
-}
-
-const submit = async () => {
-  return { id: props.id, data: formData.value.avatar}
-}
-
-defineExpose({
-  id: props.id,
-  submit
-})
-
-</script>
-
-<style lang="less" scoped>
-
-.wrapper{
-	padding: 15px;
-  padding-top: 30px;
-}
-.upload-img{
-  position: relative;
-  width: 200rpx;
-  height: 200rpx;
-  border: 1px solid #f1f1f1;
-  margin: 10rpx;
-}
-.upload-file{
-  width: 200rpx;
-  height: 200rpx;
-  border: 1px solid #f1f1f1;
-  margin: 10rpx;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  border-radius: 10rpx;
-}
-</style>

+ 0 - 180
pagesA/resumeAnalysis/components/baseInfoEdit.vue

@@ -1,180 +0,0 @@
-<template>
-	<view class="f-straight wrapper">
-		<uni-forms ref="form" :modelValue="formData" :rules="rules" validateTrigger="bind" label-width="105px" label-align="right">
-			<uni-forms-item required label="中文名" name="name">
-        <uni-easyinput v-model="formData.name" placeholder="请输入中文名" />
-			</uni-forms-item>
-      <uni-forms-item label="性别" name="sex" required>
-				<uni-data-checkbox v-model="formData.sex" :localdata="sexData" />
-			</uni-forms-item>
-      <uni-forms-item label="联系电话" name="phone" clearable>
-        <uni-easyinput v-model="formData.phone" placeholder="请输入电话号码" />
-			</uni-forms-item>
-      <uni-forms-item label="常用邮箱" name="email" clearable required>
-        <uni-easyinput v-model="formData.email" placeholder="请输入常用邮箱" />
-			</uni-forms-item>
-      <uni-forms-item required label="出生日期" name="birthday">
-        <uni-datetime-picker type="date" return-type="timestamp" v-model="formData.birthday" />
-			</uni-forms-item>
-      <uni-forms-item label="首次工作时间" name="firstWorkTime">
-        <uni-datetime-picker type="date" return-type="timestamp" v-model="formData.firstWorkTime" />
-			</uni-forms-item>
-			<uni-forms-item required label="工作年限" name="expType" >
-				<uni-data-picker v-model="formData.expType" :localdata="dictObj.exp" :clear-icon="false" popup-title="请选择工作年限" :clear="false" :map="map"></uni-data-picker>
-			</uni-forms-item>
-      <uni-forms-item required label="最高学历" name="eduType" >
-				<uni-data-picker v-model="formData.eduType" :localdata="dictObj.edu" :clear-icon="false" popup-title="请选择最高学历" :clear="false" :map="map"></uni-data-picker>
-			</uni-forms-item>
-			<uni-forms-item required label="求职类型" name="jobType" >
-				<uni-data-picker v-model="formData.jobType" :localdata="dictObj.jobType" :clear-icon="false" popup-title="请选择求职类型" :map="map"></uni-data-picker>
-			</uni-forms-item>
-      <uni-forms-item required label="求职状态" name="jobStatus" >
-				<uni-data-picker v-model="formData.jobStatus" :localdata="dictObj.jobStatus" :clear-icon="false" popup-title="请选择求职状态" :map="map"></uni-data-picker>
-			</uni-forms-item>
-      <uni-forms-item label="婚姻状况" name="maritalStatus" >
-				<uni-data-picker v-model="formData.maritalStatus" :localdata="dictObj.marital" :clear-icon="true" popup-title="请选择婚姻状况" :map="map"></uni-data-picker>
-			</uni-forms-item>
-      <uni-forms-item label="所在城市" name="areaId" >
-				<uni-data-picker v-model="formData.areaId" :localdata="dictObj.areaTreeData" :clear-icon="true" popup-title="请选择所在城市" :map="{ text: 'name', value: 'id'}"></uni-data-picker>
-			</uni-forms-item>
-      <uni-forms-item label="户籍地" name="regId" >
-				<uni-data-picker v-model="formData.regId" :localdata="dictObj.areaTreeData" :clear-icon="true" popup-title="请选择户籍所在地" :map="{ text: 'name', value: 'id'}"></uni-data-picker>
-			</uni-forms-item>
-		</uni-forms>
-	</view>
-</template>
-
-<script setup>
-import { cloneDeep } from 'lodash-es'
-import { emailRequired } from '@/utils/validate'
-import { dictObj } from '@/utils/position.js'
-import { userStore } from '@/store/user'
-import { removeEmptyProperties } from "@/utils/index"
-// import { saveBaseInfo, updatePersonAvatar } from '@/api/user'
-// import { uploadFile } from '@/api/file'
-import { ref, watch, unref } from 'vue'
-const props = defineProps({
-  id: {
-    type: String,
-    default: ''
-  },
-  text: {
-    type: String,
-    default: ''
-  },
-  data: {
-    type: Object,
-    default: () => ({})
-  }
-})
-
-const form = ref()
-const sexData = ref([])
-const map = { text: 'label', value: 'value' }
-const useUserStore = userStore()
-
-const formData = ref({
-  name: '',
-  sex: '',
-  regId: '',
-  birthday: '1985-05-01',
-  phone: '',
-  email: '',
-  eduType: '',
-  firstWorkTime: '',
-  expType: '',
-  jobType: '',
-  jobStatus: '',
-  maritalStatus: '',
-  areaId: ''
-})
-const getInfo = (data) => {
-  data.phone = data.phone || useUserStore?.baseInfo?.phone
-  Object.keys(formData.value).forEach(key => formData.value[key] = data[key])
-}
-
-watch(
-  () => props.data,
-  (newVal) => {
-    if (newVal && Object.keys(newVal)) {
-      const data = removeEmptyProperties(newVal)
-      getInfo(data)
-    }
-  },
-  { immediate: true },
-)
-
-if (dictObj && dictObj?.sex) {
-  sexData.value = dictObj.sex.map(e => {
-    return { text: e.label, value: e.value, ...e }
-  })
-}
-
-const rules = {
-	name:{
-		rules: [{required: true, errorMessage: '请输入姓名' }]
-	},
-	sex : {
-		rules: [{required: true, errorMessage: '请选择您的性别' }]
-	},
-	birthday: {
-		rules: [{required: true, errorMessage: '请选择您的出生日期' }]
-	},
-  email: emailRequired,
-  expType: {
-		rules: [{required: true, errorMessage: '请选择您的工作年限' }]
-	},
-  eduType: {
-		rules: [{required: true, errorMessage: '请选择您的最高学历' }]
-	},
-  jobType: {
-		rules: [{required: true, errorMessage: '请选择您的求职类型' }]
-	},
-  jobStatus: {
-		rules: [{required: true, errorMessage: '请选择您的求职状态' }]
-	}
-}
-
-
-const submit = async () => {
-  try {
-    const valid = await unref(form).validate()
-    // if (!valid) return { id: props.id, data: null}
-    return { id: props.id, data: formData.value}
-  } catch (error) {
-    return { text: props.text }
-  }
-}
-
-defineExpose({
-  id: props.id,
-  submit
-})
-
-
-</script>
-
-<style lang="less" scoped>
-
-.wrapper{
-	padding: 15px;
-  // padding-top: 30px;
-}
-.upload-img{
-  position: relative;
-  width: 200rpx;
-  height: 200rpx;
-  border: 1px solid #f1f1f1;
-  margin: 10rpx;
-}
-.upload-file{
-  width: 200rpx;
-  height: 200rpx;
-  border: 1px solid #f1f1f1;
-  margin: 10rpx;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  border-radius: 10rpx;
-}
-</style>

+ 0 - 177
pagesA/resumeAnalysis/components/educationExp.vue

@@ -1,177 +0,0 @@
-<template>
-	<view class="f-straight wrapper">
-    <uni-forms ref="form" :modelValue="formData" :rules="rules" validateTrigger="bind" label-width="90px">
-      <uni-forms-item label="学校名称" name="schoolName" required>
-				<uni-combox :candidates="schoolData" placeholder="学校名称" v-model="formData.schoolName" @input="handleSearchSchool"></uni-combox>
-			</uni-forms-item>
-      <uni-forms-item label="所学专业" name="major" required>
-				<uni-combox :candidates="majorData" placeholder="所学专业" v-model="formData.major" @input="handleSearchMajor"></uni-combox>
-			</uni-forms-item>
-      <uni-forms-item label="学历" name="educationType" required>
-        <uni-data-select v-model="formData.educationType" :localdata="searchData.eduType"></uni-data-select>
-			</uni-forms-item>
-      <uni-forms-item label="学制类型" name="educationSystemType" required>
-        <uni-data-select v-model="formData.educationSystemType" :localdata="searchData.eduSystemType"></uni-data-select>
-			</uni-forms-item>
-      <uni-forms-item label="开始时间" name="startTime" required>
-				<picker mode="date" :value="formData.startTime" fields="month" :end="endDate" @change="e => formData.startTime = e.detail.value">
-					<view class="uni-input ss-m-t-20">{{ formData.startTime }}</view>
-				</picker>
-			</uni-forms-item>
-      <uni-forms-item label="结束时间" name="endTime" required>
-				<picker mode="date" :value="formData.endTime" fields="month" @change="e => formData.endTime = e.detail.value">
-					<view class="uni-input ss-m-t-20">{{ formData.endTime }}</view>
-				</picker>
-			</uni-forms-item>
-      <uni-forms-item label="在校经历" name="content">
-				<uni-easyinput type="textarea" v-model="formData.content" autoHeight  placeholder="请输入内容"></uni-easyinput>
-			</uni-forms-item>
-    </uni-forms>
-	</view>
-</template>
-
-<script setup>
-import { cloneDeep } from 'lodash-es'
-import { ref, watch, unref } from 'vue'
-import { dictObj } from '@/utils/position.js'
-import { convertYearMonthToTimestamp, timesTampChange } from '@/utils/date.js'
-import { removeEmptyProperties } from "@/utils/index"
-const props = defineProps({
-  id: {
-    type: String,
-    default: ''
-  },
-  text: {
-    type: String,
-    default: ''
-  },
-  data: {
-    type: Object,
-    default: () => ({})
-  }
-})
-
-let formData = ref({
-  startTime: '2014-01',
-  endTime: '2018-01'
-})
-const majorData = ref([])
-const schoolData = ref([])
-const form = ref()
-const date = new Date()
-const endDate = date.getFullYear() + '-' + (date.getMonth() + 1) // 不可选时间
-const searchData = ref({
-  school: [],
-  major: [],
-  eduType: dictObj.edu.map(e => ({ text: e.label, value: e.value})),
-  eduSystemType: dictObj.eduSystemType.map(e => ({ text: e.label, value: e.value}))
-})
-
-const getInfo = (data) => {
-  data.startTime = data.startTime ? timesTampChange(data.startTime, 'Y-M') : '2014-01'
-  data.endTime = data.endTime ? timesTampChange(data.endTime, 'Y-M') : '2018-01'
-  formData.value = cloneDeep(data) || {
-    startTime: '2014-01',
-    endTime: '2018-01'
-  }
-}
-
-watch(
-  () => props.data,
-  (newVal) => {
-    if (newVal && Object.keys(newVal)) {
-      const data = removeEmptyProperties(newVal)
-      getInfo(data)
-    }
-  },
-  { immediate: true },
-)
-
-const rules = {
-	schoolName:{
-		rules: [{required: true, errorMessage: '请输入学校名称' }]
-	},
-	major:{
-		rules: [{required: true, errorMessage: '请输入所学专业' }]
-	},
-	educationType:{
-		rules: [{required: true, errorMessage: '请选择学历' }]
-	},
-	educationSystemType:{
-		rules: [{required: true, errorMessage: '请选择学制类型' }]
-	},
-	startTime:{
-		rules: [{required: true, errorMessage: '请选择开始时间' }]
-	},
-	endTime:{
-		rules: [{required: true, errorMessage: '请选择结束时间' }]
-	}
-}
-
-
-// 学校搜索
-const handleSearchSchool = (e) => {
-  if (!e) return schoolData.value = []
-  schoolSearchByName({ name: e }).then(res => {
-    searchData.value.school = res.data
-    schoolData.value = res.data && res.data?.length ? res.data.map(e => e.value) : []
-  })
-}
-
-// 专业搜索
-const handleSearchMajor = (e) => {
-  if (!e) return majorData.value = []
-  schoolMajorByName({ name: e }).then(res => {
-    searchData.value.major = res.data
-    majorData.value = res.data && res.data?.length ? res.data.map(e => e.nameCn) : []
-  })
-}
-
-const submit = async () => {
-  try {
-    const valid = await unref(form).validate()
-    // if (!valid) return { id: props.id, data: null}
-    const startTime = convertYearMonthToTimestamp(formData.value.startTime)
-    const endTime = convertYearMonthToTimestamp(formData.value.endTime)
-    if (startTime > endTime) {
-      uni.showToast({ icon: 'none', title: '开始时间不能大于结束时间' })
-      return
-    }
-    return { id: props.id, data: { ...formData.value, startTime, endTime }}
-  } catch (error) {
-    return { text: props.text }
-  }
-}
-
-defineExpose({
-  id: props.id,
-  submit
-})
-
-
-</script>
-
-<style lang="less" scoped>
-
-.wrapper{
-	padding: 15px;
-  // padding-top: 30px;
-}
-.upload-img{
-  position: relative;
-  width: 200rpx;
-  height: 200rpx;
-  border: 1px solid #f1f1f1;
-  margin: 10rpx;
-}
-.upload-file{
-  width: 200rpx;
-  height: 200rpx;
-  border: 1px solid #f1f1f1;
-  margin: 10rpx;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  border-radius: 10rpx;
-}
-</style>

+ 0 - 137
pagesA/resumeAnalysis/components/trainingExperience.vue

@@ -1,137 +0,0 @@
-<template>
-	<view class="f-straight wrapper">
-    <uni-forms ref="form" :modelValue="formData" :rules="rules" validateTrigger="bind" label-width="90px">
-      <uni-forms-item label="培训中心" name="orgName" required>
-				<uni-easyinput type="text" v-model="formData.orgName" placeholder="请输入内容"></uni-easyinput>
-			</uni-forms-item>
-      <uni-forms-item label="培训课程" name="course" required>
-				<uni-easyinput type="text" v-model="formData.course" placeholder="请输入内容"></uni-easyinput>
-			</uni-forms-item>
-      <uni-forms-item label="开始时间" name="startTime" required>
-				<picker mode="date" :value="formData.startTime" fields="month" :end="endDate" @change="e => formData.startTime = e.detail.value">
-					<view class="uni-input ss-m-t-20">{{ formData.startTime }}</view>
-				</picker>
-			</uni-forms-item>
-      <uni-forms-item label="结束时间" name="endTime" required>
-				<picker mode="date" :value="formData.endTime" fields="month" :end="endDate" @change="e => formData.endTime = e.detail.value">
-          <view class="uni-input ss-m-t-20">{{ formData.endTime }}</view>
-        </picker>
-			</uni-forms-item>
-      <uni-forms-item label="培训描述" name="content">
-				<uni-easyinput type="textarea" v-model="formData.content" autoHeight  placeholder="请输入内容"></uni-easyinput>
-			</uni-forms-item>
-    </uni-forms>
-	</view>
-</template>
-
-<script setup>
-import { cloneDeep } from 'lodash-es'
-import { ref, watch, unref } from 'vue'
-import { convertYearMonthToTimestamp, timesTampChange } from '@/utils/date.js'
-import { removeEmptyProperties } from "@/utils/index"
-const props = defineProps({
-  id: {
-    type: String,
-    default: ''
-  },
-  text: {
-    type: String,
-    default: ''
-  },
-  data: {
-    type: Object,
-    default: () => ({})
-  }
-})
-
-let formData = ref({
-  startTime: '2014-01',
-  endTime: '2018-01'
-})
-const form = ref()
-const date = new Date()
-const endDate = date.getFullYear() + '-' + (date.getMonth() + 1) // 不可选时间
-
-const getInfo = (data) => {
-  data.startTime = data.startTime ? timesTampChange(data.startTime, 'Y-M') : '2014-01'
-  data.endTime = data.endTime ? timesTampChange(data.endTime, 'Y-M') : '2018-01'
-  formData.value = cloneDeep(data) || {
-    startTime: '2014-01',
-    endTime: '2018-01'
-  }
-}
-
-watch(
-  () => props.data,
-  (newVal) => {
-    if (newVal && Object.keys(newVal)) {
-      const data = removeEmptyProperties(newVal)
-      getInfo(data)
-    }
-  },
-  { immediate: true },
-)
-
-const rules = {
-	orgName:{
-		rules: [{required: true, errorMessage: '请输入培训中心' }]
-	},
-	course:{
-		rules: [{required: true, errorMessage: '请输入培训课程' }]
-	},
-	startTime:{
-		rules: [{required: true, errorMessage: '请选择培训开始时间' }]
-	},
-  endTime:{
-		rules: [{required: true, errorMessage: '请选择培训结束时间' }]
-	}
-}
-
-const submit = async () => {
-  try {
-    const valid = await unref(form).validate()
-    // if (!valid) return { id: props.id, data: null}
-    const startTime = convertYearMonthToTimestamp(formData.value.startTime)
-    const endTime = convertYearMonthToTimestamp(formData.value.endTime)
-    if (startTime > endTime) {
-      uni.showToast({ icon: 'none', title: '开始时间不能大于结束时间' })
-      return
-    }
-    return { id: props.id, data: { ...formData.value, startTime, endTime }}
-  } catch (error) {
-    return { text: props.text }
-  }
-}
-
-defineExpose({
-  id: props.id,
-  submit
-})
-
-
-</script>
-
-<style lang="less" scoped>
-
-.wrapper{
-	padding: 15px;
-  // padding-top: 30px;
-}
-.upload-img{
-  position: relative;
-  width: 200rpx;
-  height: 200rpx;
-  border: 1px solid #f1f1f1;
-  margin: 10rpx;
-}
-.upload-file{
-  width: 200rpx;
-  height: 200rpx;
-  border: 1px solid #f1f1f1;
-  margin: 10rpx;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  border-radius: 10rpx;
-}
-</style>

+ 0 - 182
pagesA/resumeAnalysis/components/workExperience.vue

@@ -1,182 +0,0 @@
-<template>
-	<view class="f-straight wrapper">
-    <uni-forms ref="form" :modelValue="formData" :rules="rules" validateTrigger="bind" label-width="90px">
-      <uni-forms-item label="企业名称" name="enterpriseName" required>
-				<uni-combox :candidates="enterpriseData" placeholder="企业名称" v-model="formData.enterpriseName" @input="handleSearchEnterprise"></uni-combox>
-			</uni-forms-item>
-      <uni-forms-item label="职位名称" name="positionName" required>
-				<uni-combox :candidates="positionData" placeholder="职位名称" v-model="formData.positionName"></uni-combox>
-			</uni-forms-item>
-      <uni-forms-item label="开始时间" name="startTime" required>
-				<picker mode="date" :value="formData.startTime" fields="month" :end="endDate" @change="e => formData.startTime = e.detail.value">
-					<view class="uni-input ss-m-t-20">{{ formData.startTime }}</view>
-				</picker>
-			</uni-forms-item>
-      <uni-forms-item label="结束时间" name="endTime" required>
-				<view class="d-flex">
-          <picker mode="date" :value="formData.endTime" :disabled="endDisabled" fields="month" :end="endDate" @change="e => formData.endTime = e.detail.value">
-            <view class="uni-input ss-m-t-20" :style="{'opacity': endDisabled ? '0.5' : '1'}">{{ formData.endTime }}</view>
-          </picker>
-          <uni-data-checkbox selectedColor="#00B760" class="ss-m-l-50 ss-m-t-14" multiple v-model="sofar" :localdata="[{ text: '至今', value: 1 }]" @change="handleChangeSofar"></uni-data-checkbox>
-        </view>
-			</uni-forms-item>
-      <uni-forms-item label="工作内容" name="content" required>
-				<uni-easyinput type="textarea" v-model="formData.content" autoHeight  placeholder="请输入内容"></uni-easyinput>
-			</uni-forms-item>
-    </uni-forms>
-	</view>
-</template>
-
-<script setup>
-import { cloneDeep } from 'lodash-es'
-import { ref, watch, unref } from 'vue'
-import { getDict } from '@/hooks/useDictionaries.js'
-import { convertYearMonthToTimestamp, timesTampChange } from '@/utils/date.js'
-import { removeEmptyProperties } from "@/utils/index"
-const props = defineProps({
-  id: {
-    type: String,
-    default: ''
-  },
-  text: {
-    type: String,
-    default: ''
-  },
-  data: {
-    type: Object,
-    default: () => ({})
-  }
-})
-
-let formData = ref({
-  startTime: '2014-01',
-  endTime: '2018-01'
-})
-const sofar = ref([])
-const endDisabled = ref(false)
-const enterpriseData = ref([])
-const positionData = ref([])
-const form = ref()
-const date = new Date()
-const endDate = date.getFullYear() + '-' + (date.getMonth() + 1) // 不可选时间
-const searchData = ref({
-  enterprise: [],
-  position: []
-})
-
-const getInfo = (data) => {
-  data.startTime = data.startTime ? timesTampChange(data.startTime, 'Y-M') : '2014-01'
-  data.endTime = data.endTime ? timesTampChange(data.endTime, 'Y-M') : null
-  if (!data.endTime) {
-    endDisabled.value = true
-    data.endTime = '2018-01'
-    sofar.value = [1]
-  }
-  formData.value = cloneDeep(data) || {
-    startTime: '2014-01',
-    endTime: '2018-01'
-  }
-}
-
-watch(
-  () => props.data,
-  (newVal) => {
-    if (newVal && Object.keys(newVal)) {
-      const data = removeEmptyProperties(newVal)
-      getInfo(data)
-    }
-  },
-  { immediate: true },
-)
-
-const rules = {
-	enterpriseName:{
-		rules: [{required: true, errorMessage: '请输入企业名称' }]
-	},
-	positionName:{
-		rules: [{required: true, errorMessage: '请输入职位名称' }]
-	},
-	startTime:{
-		rules: [{required: true, errorMessage: '请选择开始时间' }]
-	},
-  content:{
-		rules: [{required: true, errorMessage: '请输入工作内容' }]
-	}
-}
-
-
-// 企业搜索
-const handleSearchEnterprise = (e) => {
-  if (!e) return enterpriseData.value = []
-  enterpriseSearchByName({ name: e }).then(res => {
-    searchData.value.enterprise = res.data
-    enterpriseData.value = res.data && res.data?.length ? res.data.map(e => e.value) : []
-  })
-}
-
-let positionTreeChildrenData = []
-getDict('positionTreeData', null, 'positionTreeData').then(({ data }) => {
-  data = data.data?.length && data.data || []
-  data.forEach(e => {
-    if (e?.children?.length) positionTreeChildrenData = positionTreeChildrenData.concat(e.children)
-  })
-  searchData.value.position = positionTreeChildrenData
-  positionData.value = positionTreeChildrenData.map(e => e.nameCn)
-})
-
-// 至今
-const handleChangeSofar = (e) => {
-  const value = e.detail.value.length ? e.detail.value[0] : ''
-  endDisabled.value = value ? true : false
-}
-
-const submit = async () => {
-  try {
-    const valid = await unref(form).validate()
-    // if (!valid) return { id: props.id, data: null}
-    if (!formData.value.endTime && !sofar.value.length) return uni.showToast({ icon: 'none', title: '请选择工作经历的结束时间' })
-    //
-    const startTime = convertYearMonthToTimestamp(formData.value.startTime)
-    const endTime = sofar.value.length ? null : convertYearMonthToTimestamp(formData.value.endTime)
-    if (endTime && startTime > endTime) {
-      uni.showToast({ icon: 'none', title: '开始时间不能大于结束时间' })
-      return
-    }
-    return { id: props.id, data: { ...formData.value, startTime, endTime }}
-  } catch (error) {
-    return { text: props.text }
-  }
-}
-
-defineExpose({
-  id: props.id,
-  submit
-})
-
-
-</script>
-
-<style lang="less" scoped>
-
-.wrapper{
-	padding: 15px;
-  // padding-top: 30px;
-}
-.upload-img{
-  position: relative;
-  width: 200rpx;
-  height: 200rpx;
-  border: 1px solid #f1f1f1;
-  margin: 10rpx;
-}
-.upload-file{
-  width: 200rpx;
-  height: 200rpx;
-  border: 1px solid #f1f1f1;
-  margin: 10rpx;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  border-radius: 10rpx;
-}
-</style>

+ 0 - 221
pagesA/resumeAnalysis/index.vue

@@ -1,221 +0,0 @@
-<!-- 简历附件解析 -->
-<template>
-  <view>
-    <!-- 选择简历 -->
-    <resume v-if="step === 1" resumeAnalysis @submit="handleResumeAnalysis"></resume>
-    <!-- 解析内容-表单 -->
-    <view v-if="step === 2 && formLIst?.length" style="padding-bottom: 150rpx;">
-      <uni-card v-for="item of formLIst" :key="item.id" :id="item.id">
-		    <uni-section :title="item.text" type="line">
-          <template v-slot:right>
-            <view v-if="item.path !== 'baseInfoEdit'" style="color: #e64340;" @click="del(item)">删除</view>
-          </template>
-          <avatarEdit v-if="item.path === 'avatarEdit'" ref="componentRef" :id="item.id"  :text="item.text" :data="item.data" />
-          <baseInfoEdit v-if="item.path === 'baseInfoEdit'" ref="componentRef" :id="item.id"  :text="item.text" :data="item.data" />
-          <advantageEdit v-if="item.path === 'advantageEdit'" ref="componentRef" :id="item.id"  :text="item.text" :data="item.data" />
-          <educationEdit v-if="item.path === 'educationEdit'" ref="componentRef" :id="item.id"  :text="item.text" :data="item.data" />
-          <workExperienceEdit v-if="item.path === 'workExperienceEdit'" ref="componentRef" :id="item.id"  :text="item.text" :data="item.data" />
-          <trainingExperienceEdit v-if="item.path === 'trainingExperienceEdit'" ref="componentRef" :id="item.id"  :text="item.text" :data="item.data" />
-        </uni-section>
-      </uni-card>
-      <!-- 保存 -->
-      <view class="bottom-sticky flex-column ss-p-b-25" style="background-color: #fff; z-index: 2000; border-top: 1px solid #eee;">
-        <button class="recomm-button" :loading="submitLoading" @click="submit">提交(保存至在线简历)</button>
-      </view>
-    </view>
-    <view v-if="step === 3">
-      <view class="tips">加载中...</view>
-    </view>
-    <view v-if="step === 4">
-      <view class="tips">加载失败</view>
-    </view>
-    <!-- 确认框 -->
-    <uni-popup ref="confirmRef" type="dialog">
-      <uni-popup-dialog
-        type="warn"
-        cancelText="取消"
-        confirmText="确认" 
-        title="系统提示"
-        :showClose="showClose"
-        :content="dialogContent"
-        @confirm="handleConfirm"
-        @close="null"
-      ></uni-popup-dialog>
-    </uni-popup>
-  </view>
-</template>
-
-<script setup>
-import { saveResumeInfo, resumeParser2 } from '@/api/user'
-// import { envObj, baseUrl } from '@/utils/config'
-import resume from '../resume/index.vue'
-import { ref, shallowRef } from 'vue'
-import avatarEdit from './components/avatarEdit.vue'
-import baseInfoEdit from './components/baseInfoEdit.vue'
-import advantageEdit from './components/advantage.vue'
-import educationEdit from './components/educationExp.vue'
-import workExperienceEdit from './components/workExperience.vue'
-import trainingExperienceEdit from './components/trainingExperience.vue'
-import { resumeParser2Data } from './testData.js'
-
-const step = ref(1)
-
-const exampleList = {
-  avatar: { text: '头像', id: 'avatar', path: 'avatarEdit' },
-  person: { text: '基础信息', id: 'person', path: 'baseInfoEdit' },
-  advantage: { text: '个人优势', id: 'advantage', path: 'advantageEdit' },
-  eduList: { text: '教育经历', id: 'eduList', path: 'educationEdit' },
-  workList: { text: '工作经历', id: 'workList', path: 'workExperienceEdit' },
-  trainList: { text: '培训经历', id: 'trainList', path: 'trainingExperienceEdit' },
-}
-
-const resumeTxt = ref([]) // 查看文本信息
-const formLIst = shallowRef([])
-const transformToLIst = async (result) => {
-  formLIst.value = []
-  if (result && Object.keys(result)) {
-    if (result.resume?.rawText) resumeTxt.value = result.resume.rawText.split('\n') || []
-    if (result.person?.advantage) result.advantage = result.person.advantage
-    if (result.person?.avatar) result.avatar = result.person.avatar
-    // obj
-    const dealObjKeys = ['avatar', 'person', 'advantage']
-    dealObjKeys.forEach(key => {
-      if (result[key]) {
-        const obj = {...exampleList[key]}
-        obj.data = result[key]
-        formLIst.value.push(obj)
-      }
-    })
-    // arr
-    const dealArrKeys = ['eduList', 'workList', 'trainList']
-    dealArrKeys.forEach(key => {
-      if (result[key]?.length) {
-        for (let index = 0; index < result[key].length; index++) {
-          const obj = {...exampleList[key]}
-          obj.id = obj.id + '_' + index
-          obj.text = result[key].length > 1 ? obj.text + (index+1) : obj.text
-          obj.data = result[key][index]
-          formLIst.value.push(obj)
-        }
-      }
-    })
-  }
-  // console.log('formLIst:', formLIst.value)
-}
-
-const confirmRef = ref()
-const dialogContent = ref('')
-const showClose = ref(true)
-let delId = null
-let dialogType = 'del'
-
-const del = (item) => {
-  dialogContent.value = `是否确认删除${item.text}?`
-  delId = item.id
-  dialogType = 'del'
-  showClose.value = true
-  confirmRef.value.open()
-}
-
-const handleConfirm = () => {
-  if (dialogType === 'del') {
-    formLIst.value = formLIst.value.filter(e => e.id !== delId)
-  }
-  if (dialogType === 'submitSuccess') {
-    uni.navigateTo({ url: '/pagesA/resumeOnline/index' })
-  }
-}
-
-// const result = ref(JSON.parse(JSON.stringify(data))) // 测试
-// transformToLIst(result.value) // 测试
-
-const result = ref({})
-const loading = ref(false)
-const handleAnalysis = async (url) => {
-  url = decodeURIComponent(url)
-  if (!url) return
-  loading.value = true
-  step.value = 3
-  try {
-    // const res = await resumeParser2({ fileUrl: url })
-    // result.value = res?.data || {}
-    result.value = resumeParser2Data
-    await transformToLIst(result.value)
-    step.value = 2
-  } catch (error) {
-    step.value = 4
-    console.log(error)
-  } finally {
-    loading.value = false
-  }
-}
-
-const handleResumeAnalysis = (url) => {
-  if (!url) {
-    return uni.showToast({ icon: 'none', title: '请选择要解析的简历' })
-  }
-  handleAnalysis(url)
-}
-
-const componentRef = ref()
-const getValue = async () => {
-  let text = ''
-  let data = {}
-  for (let index = 0; index < componentRef.value.length; index++) {
-    const e = componentRef.value[index]
-    const query = await e.submit()
-    if (query && query.data) {
-      data[query.id] = query.data
-    } else {
-      if (!text) text = query.text
-    }
-  }
-  if (text) {
-    uni.showToast({ icon: 'none', title: `请完整填写 ${text} 后提交!` })
-    return
-  }
-  // 处理data
-  let obj = Object.keys(data).length ? {} : null
-  const keyTransform = { // 转换给后端的key
-    eduList: 'eduExp',
-    workList: 'workExp',
-    trainList: 'trainExp',
-  }
-  if (obj) {
-    Object.keys(data).forEach(key => {
-      if (key.includes('_')) { // 数组
-        const oldKey = key.split('_')[0]
-        const newKey = keyTransform[oldKey] ? keyTransform[oldKey] : oldKey
-        if (!obj[newKey]) obj[newKey] = [data[key]]
-        else obj[newKey].push(data[key])
-      } else {
-        const newKey = keyTransform[key] ? keyTransform[key] : key
-        obj[newKey] = data[key]
-      }
-    })
-  }
-  console.log('123456:', obj)
-  return obj && Object.keys(obj).length ? JSON.stringify(obj) : null
-}
-
-const submitLoading = ref(false)
-const submit = async () => {
-  const obj = await getValue()
-  if (!obj) return
-  submitLoading.value = true
-  await saveResumeInfo(obj)
-  dialogType = 'submitSuccess'
-  dialogContent.value = '提交成功,立即前往在线简历查看'
-  showClose.value = false
-  confirmRef.value.open()
-  // await useUserStore().getUserBaseInfos() // 更新用户信息
-}
-
-</script>
-<style lang="scss" scoped>
-.tips {
-  text-align: center;
-  margin-top: 50px;
-  color: #777;
-}
-</style>

Разлика између датотеке није приказан због своје велике величине
+ 0 - 9
pagesA/resumeAnalysis/testData.js


+ 0 - 50
pagesA/resumeOnline/advantage.vue

@@ -1,50 +0,0 @@
-<!--  -->
-<template>
-  <view style="padding: 20rpx 30rpx;">
-    <textarea
-      placeholder-style="color:#F76260"
-      placeholder="请填写您的个人优势..."
-      auto-focus
-      maxlength="300"
-      v-model="advantage"
-      style="border: 1rpx solid gray; width: 100%; min-height: 300px;"
-    ></textarea>
-    <view class="f-horizon-center">
-      <button type="primary" size="default" class="send-button"  @click="submit">提 交</button>
-    </view>
-  </view>
-</template>
-
-<script setup>
-import { saveResumeAdvantage } from '@/api/user'
-import { ref } from 'vue'
-import { userStore } from '@/store/user'; const useUserStore = userStore()
-
-const advantage = ref('')
-// 获取基础信息-
-function getBaseInfo () {
-  const baseInfo = useUserStore.baseInfo
-  advantage.value = baseInfo?.advantage || ''
-}
-
-// 获取基础信息
-getBaseInfo()
-// 提交
-const submit = async () => {
-  if (!advantage.value) {
-    uni.showToast({ title: '请填写您的个人优势', icon: 'none' })
-    return
-  }
-  await saveResumeAdvantage({ content: advantage.value })
-  uni.showToast({ title: '编辑成功', icon: 'success' })
-  await useUserStore.getInfo()
-  //
-  setTimeout(() => {
-		uni.navigateBack({
-			delta: 1,
-		})
-	}, 1000);
-}
-</script>
-<style lang="scss" scoped>
-</style>

+ 0 - 214
pagesA/resumeOnline/baseInfoEdit.vue

@@ -1,214 +0,0 @@
-<template>
-	<view class="f-straight wrapper">
-		<uni-forms ref="form" :modelValue="formData" :rules="rules" validateTrigger="bind" label-width="105px" label-align="right">
-			<uni-forms-item label="头像" name="avatar" class="f-straight" required>
-        <view style="display: flex;flex-wrap: wrap;">
-          <view class="upload-img" v-if="formData?.avatar">
-            <uni-icons size="35" type="clear" color="#fe574a" style="position: absolute;right: -15px; top: -15px; z-index: 9" @click="formData.avatar = ''"></uni-icons>
-            <image :src="formData?.avatar" mode="contain" style="width: 200rpx;height: 200rpx;" @click="handlePreviewImage"></image>
-          </view>
-          <view v-else class="upload-file" @click="uploadPhotos">
-            <uni-icons type="plusempty" size="50" color="#f1f1f1"></uni-icons>
-          </view>
-        </view>
-			</uni-forms-item>
-			<uni-forms-item required label="中文名" name="name">
-        <uni-easyinput v-model="formData.name" placeholder="请输入中文名" />
-			</uni-forms-item>
-      <uni-forms-item label="性别" name="sex" required>
-				<uni-data-checkbox v-model="formData.sex" :localdata="sexData" />
-			</uni-forms-item>
-      <uni-forms-item label="联系电话" name="phone" clearable>
-        <uni-easyinput v-model="formData.phone" placeholder="请输入电话号码" />
-			</uni-forms-item>
-      <uni-forms-item label="常用邮箱" name="email" clearable required>
-        <uni-easyinput v-model="formData.email" placeholder="请输入常用邮箱" />
-			</uni-forms-item>
-      <uni-forms-item required label="出生日期" name="birthday">
-        <uni-datetime-picker type="date" return-type="timestamp" v-model="formData.birthday" />
-			</uni-forms-item>
-      <uni-forms-item label="首次工作时间" name="firstWorkTime">
-        <uni-datetime-picker type="date" return-type="timestamp" v-model="formData.firstWorkTime" />
-			</uni-forms-item>
-			<uni-forms-item required label="工作年限" name="expType" >
-				<uni-data-picker v-model="formData.expType" :localdata="dictObj.exp" :clear-icon="false" popup-title="请选择工作年限" :clear="false" :map="map"></uni-data-picker>
-			</uni-forms-item>
-      <uni-forms-item required label="最高学历" name="eduType" >
-				<uni-data-picker v-model="formData.eduType" :localdata="dictObj.edu" :clear-icon="false" popup-title="请选择最高学历" :clear="false" :map="map"></uni-data-picker>
-			</uni-forms-item>
-			<uni-forms-item required label="求职类型" name="jobType" >
-				<uni-data-picker v-model="formData.jobType" :localdata="dictObj.jobType" :clear-icon="false" popup-title="请选择求职类型" :map="map"></uni-data-picker>
-			</uni-forms-item>
-      <uni-forms-item required label="求职状态" name="jobStatus" >
-				<uni-data-picker v-model="formData.jobStatus" :localdata="dictObj.jobStatus" :clear-icon="false" popup-title="请选择求职状态" :map="map"></uni-data-picker>
-			</uni-forms-item>
-      <uni-forms-item label="婚姻状况" name="maritalStatus" >
-				<uni-data-picker v-model="formData.maritalStatus" :localdata="dictObj.marital" :clear-icon="true" popup-title="请选择婚姻状况" :map="map"></uni-data-picker>
-			</uni-forms-item>
-      <uni-forms-item label="所在城市" name="areaId" >
-				<uni-data-picker v-model="formData.areaId" :localdata="dictObj.areaTreeData" :clear-icon="true" popup-title="请选择所在城市" :map="{ text: 'name', value: 'id'}"></uni-data-picker>
-			</uni-forms-item>
-      <uni-forms-item label="户籍地" name="regId" >
-				<uni-data-picker v-model="formData.regId" :localdata="dictObj.areaTreeData" :clear-icon="true" popup-title="请选择户籍所在地" :map="{ text: 'name', value: 'id'}"></uni-data-picker>
-			</uni-forms-item>
-			<view class="f-horizon-center">
-				<button type="primary" size="default" class="send-button"  @click="submit">提 交</button>
-			</view>
-		</uni-forms>
-	</view>
-</template>
-
-<script setup>
-import { ref, unref } from 'vue'
-import { userStore } from '@/store/user'
-import { dictObj } from '@/utils/position.js'
-import { uploadFile } from '@/api/file'
-import { cloneDeep } from 'lodash-es'
-import { saveBaseInfo, updatePersonAvatar } from '@/api/user'
-import { emailRequired } from '@/utils/validate'
-
-const form = ref()
-const sexData = ref([])
-const map = { text: 'label', value: 'value' }
-const useUserStore = userStore()
-
-const formData = ref({})
-const getInfo = () => {
-  formData.value = cloneDeep(useUserStore?.baseInfo) || {
-    avatar: '',
-    name: '',
-    sex: '',
-    regId: '',
-    birthday: '1985-05-01',
-    phone: '',
-    email: '',
-    eduType: '',
-    firstWorkTime: '',
-    expType: '',
-    jobType: '',
-    jobStatus: '',
-    maritalStatus: '',
-    areaId: ''
-  }
-  // 根据字典数据初始化地区数据
-  if (dictObj && dictObj?.areaTreeData) {
-    const type = typeof dictObj.areaTreeData[0].id
-    formData.value.regId = type === 'string' ? formData.value.regId.toString() : Number(formData.value.regId)
-    formData.value.areaId = type === 'string' ? formData.value.areaId.toString() : Number(formData.value.areaId)
-  }
-}
-getInfo()
-
-if (dictObj && dictObj?.sex) {
-  sexData.value = dictObj.sex.map(e => {
-    return { text: e.label, value: e.value, ...e }
-  })
-}
-
-// 图片预览
-const handlePreviewImage = () => {
-  uni.previewImage({
-    current: 0,
-    urls: [formData.value.avatar]
-  })
-}
-
-// 选择头像
-const uploadPhotos = () => {
-  wx.chooseImage({
-    count: 1,
-    sizeType: ['original', 'compressed'],
-    sourceType: ['album', 'camera'],
-    success: function(res){
-      const size = res.tempFiles[0]?.size || 0
-      if (size >= 31457280) {
-        uni.showToast({
-          icon: 'none',
-          title: '头像上传大小不得超过 20MB !',
-          duration: 2000
-        })
-        return
-      }
-      const path = res.tempFilePaths[0]
-      uploadFile(path, 'img').then(res => {
-        formData.value.avatar = res.data
-      }).catch(error => {
-        uni.showToast({
-          icon: 'error',
-          title: '图片上传失败!',
-          duration: 2000
-        })
-      })
-    }
-  })
-}
-
-const rules = {
-	avatar:{
-		rules: [{required: true, errorMessage: '请上传头像' }]
-	},
-	name:{
-		rules: [{required: true, errorMessage: '请输入姓名' }]
-	},
-	sex : {
-		rules: [{required: true, errorMessage: '请选择您的性别' }]
-	},
-	birthday: {
-		rules: [{required: true, errorMessage: '请选择您的出生日期' }]
-	},
-  email: emailRequired,
-  expType: {
-		rules: [{required: true, errorMessage: '请选择您的工作年限' }]
-	},
-  eduType: {
-		rules: [{required: true, errorMessage: '请选择您的最高学历' }]
-	},
-  jobType: {
-		rules: [{required: true, errorMessage: '请选择您的求职类型' }]
-	},
-  jobStatus: {
-		rules: [{required: true, errorMessage: '请选择您的求职状态' }]
-	}
-}
-
-const submit = async () => {
-  const valid = await unref(form).validate()
-  if (!valid) return
-
-  await updatePersonAvatar(formData.value.avatar)
-  await saveBaseInfo(formData.value)
-  uni.showToast({ title: '编辑成功', icon: 'success' })
-  await useUserStore.getInfo()
-  getInfo()
-  setTimeout(() => {
-		uni.navigateBack({
-			delta: 1
-		})
-	}, 1000)
-}
-</script>
-
-<style lang="less" scoped>
-
-.wrapper{
-	padding: 15px;
-  padding-top: 30px;
-}
-.upload-img{
-  position: relative;
-  width: 200rpx;
-  height: 200rpx;
-  border: 1px solid #f1f1f1;
-  margin: 10rpx;
-}
-.upload-file{
-  width: 200rpx;
-  height: 200rpx;
-  border: 1px solid #f1f1f1;
-  margin: 10rpx;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  border-radius: 10rpx;
-}
-</style>

+ 0 - 94
pagesA/resumeOnline/dict.js

@@ -1,94 +0,0 @@
-import { reactive } from 'vue'
-import { getDict } from '@/hooks/useDictionaries'
-
-const dictObj = reactive({})
-const dictList = [
-  { 
-    type: 'positionData', 
-    apiType: 'positionData', 
-    key: 'positionId', 
-    label: 'position', 
-    value: 'positionTypeData', 
-    itemKey: 'id', 
-    itemText: 'nameCn'
-  },
-  { 
-    type: 'industryList', 
-    apiType: 'industryList', 
-    key: 'industryIdList', 
-    label: 'industry', 
-    isArray: true, 
-    value: 'industryTypeData', 
-    itemKey: 'id', 
-    itemText: 'nameCn' 
-  },
-  { 
-    type: 'menduner_area_type',
-    apiType: 'areaList',
-    key: 'workAreaId',
-    params: { type: undefined },
-    label: 'workArea',
-    value: 'areaTypeData',
-    itemKey: 'id',
-    itemText: 'name'
-  },
-  { 
-    type: 'menduner_job_type',
-    key: 'jobType',
-    label: 'jobTypeName',
-    value: 'jobTypeData',
-    itemKey: 'value',
-    itemText: 'label'
-  },
-  { 
-    type: 'menduner_area_type', 
-    apiType: 'areaList', 
-    key: 'interestedAreaIdList', 
-    label: 'interestedArea', 
-    // params: { type: undefined },
-    isArray: true, 
-    value: 'areaTypeData', 
-    itemKey: 'id', 
-    itemText: 'name' 
-  }
-]
-
-// 字典
-const getDictList = async () => {
-  dictList.forEach(async (val) => {
-    const { data } = await getDict(val.type, val.params, val.apiType)
-    if (!data?.data) {
-      dictObj[val.value] = []
-      return
-    }
-    dictObj[val.value] = data.data
-  })
-}
-
-const getData = async () => {
-  await getDictList()
-}
-getData()
-
-export const dealJobData = (list) => {
-  let res = {}
-  dictList.forEach(item => {
-    res = list.map(e => {
-      let obj = {}
-      if (item.isArray) {
-        if (e[item.key] && e[item.key].length) {
-          const result = e[item.key].map(val => {
-            return obj = dictObj[item.value].find(i => Number(i[item.itemKey]) === Number(val))
-          })
-          e[item.label] = result && result.length ? result.filter(Boolean) : []
-        }
-      } else {
-        obj = dictObj[item.value].find(k => Number(k[item.itemKey]) === Number(e[item.key]))
-        if (!obj) return
-        e[item.label] = obj[item.itemText]
-      }
-      return e
-    })
-  })
-  return res
-}

+ 0 - 177
pagesA/resumeOnline/educationExp.vue

@@ -1,177 +0,0 @@
-<!-- 教育经历 -->
-<template>
-  <view class="ss-m-x-30 ss-m-y-30">
-    <uni-forms ref="form" :modelValue="formData" :rules="rules" validateTrigger="bind" label-width="90px">
-      <uni-forms-item label="学校名称" name="schoolName" required>
-				<uni-combox :candidates="schoolData" placeholder="学校名称" v-model="formData.schoolName" @input="handleSearchSchool"></uni-combox>
-			</uni-forms-item>
-      <uni-forms-item label="所学专业" name="major" required>
-				<uni-combox :candidates="majorData" placeholder="所学专业" v-model="formData.major" @input="handleSearchMajor"></uni-combox>
-			</uni-forms-item>
-      <uni-forms-item label="学历" name="educationType" required>
-        <uni-data-select v-model="formData.educationType" :localdata="searchData.eduType"></uni-data-select>
-			</uni-forms-item>
-      <uni-forms-item label="学制类型" name="educationSystemType" required>
-        <uni-data-select v-model="formData.educationSystemType" :localdata="searchData.eduSystemType"></uni-data-select>
-			</uni-forms-item>
-      <uni-forms-item label="开始时间" name="startTime" required>
-				<picker mode="date" :value="formData.startTime" fields="month" :end="endDate" @change="e => formData.startTime = e.detail.value">
-					<view class="uni-input ss-m-t-20">{{ formData.startTime }}</view>
-				</picker>
-			</uni-forms-item>
-      <uni-forms-item label="结束时间" name="endTime" required>
-				<picker mode="date" :value="formData.endTime" fields="month" @change="e => formData.endTime = e.detail.value">
-					<view class="uni-input ss-m-t-20">{{ formData.endTime }}</view>
-				</picker>
-			</uni-forms-item>
-      <uni-forms-item label="在校经历" name="content">
-				<uni-easyinput type="textarea" v-model="formData.content" autoHeight  placeholder="请输入内容"></uni-easyinput>
-			</uni-forms-item>
-    </uni-forms>
-    <view class="f-horizon-center">
-      <button v-if="editId" size="default" class="delete-button commonBtnStyle" @click="handleDelete">删 除</button>
-      <button size="default" :class="{'save-button': editId, 'commonBtnStyle': editId, 'send-button': !editId}"  @click="submit">保 存</button>
-    </view>
-  </view>
-</template>
-
-<script setup>
-import { ref, unref } from 'vue'
-import { dictObj } from '@/utils/position.js'
-import { convertYearMonthToTimestamp, timesTampChange } from '@/utils/date.js'
-import { schoolSearchByName, schoolMajorByName, saveResumeEduExp, getResumeEduExp, deleteResumeEduExp } from '@/api/resume.js'
-import { onLoad } from '@dcloudio/uni-app'
-import { cloneDeep } from 'lodash-es'
-
-let formData = ref({
-  startTime: '2014-01',
-  endTime: '2018-01'
-})
-const editId = ref(null)
-const majorData = ref([])
-const schoolData = ref([])
-const form = ref()
-const date = new Date()
-const endDate = date.getFullYear() + '-' + (date.getMonth() + 1) // 不可选时间
-const searchData = ref({
-  school: [],
-  major: [],
-  eduType: dictObj.edu.map(e => ({ text: e.label, value: e.value})),
-  eduSystemType: dictObj.eduSystemType.map(e => ({ text: e.label, value: e.value}))
-})
-
-const rules = {
-	schoolName:{
-		rules: [{required: true, errorMessage: '请输入学校名称' }]
-	},
-	major:{
-		rules: [{required: true, errorMessage: '请输入所学专业' }]
-	},
-	educationType:{
-		rules: [{required: true, errorMessage: '请选择学历' }]
-	},
-	educationSystemType:{
-		rules: [{required: true, errorMessage: '请选择学制类型' }]
-	},
-	startTime:{
-		rules: [{required: true, errorMessage: '请选择开始时间' }]
-	},
-	endTime:{
-		rules: [{required: true, errorMessage: '请选择结束时间' }]
-	}
-}
-const getEduExp = async (id) => {
-  const { data } = await getResumeEduExp()
-  if (!data || !data.length) {
-    return
-  }
-  const obj = data.find(e => e.id == id)
-  formData.value = cloneDeep(obj)
-  formData.value.startTime = obj.startTime ? timesTampChange(obj.startTime, 'Y-M') : '2014-01'
-  formData.value.endTime = obj.endTime ? timesTampChange(obj.endTime, 'Y-M') : '2018-01'
-  handleSearchSchool(obj.schoolName)
-  handleSearchMajor(obj.major)
-}
-
-onLoad((options) => {
-  if (options.id) {
-    editId.value = options.id
-    getEduExp(options.id)
-  }
-})
-
-// 学校搜索
-const handleSearchSchool = (e) => {
-  if (!e) return schoolData.value = []
-  schoolSearchByName({ name: e }).then(res => {
-    searchData.value.school = res.data
-    schoolData.value = res.data && res.data?.length ? res.data.map(e => e.value) : []
-  })
-}
-
-// 专业搜索
-const handleSearchMajor = (e) => {
-  if (!e) return majorData.value = []
-  schoolMajorByName({ name: e }).then(res => {
-    searchData.value.major = res.data
-    majorData.value = res.data && res.data?.length ? res.data.map(e => e.nameCn) : []
-  })
-}
-
-// 保存
-const submit = async () => {
-  const valid = await unref(form).validate()
-  if (!valid) return
-  formData.value.majorId = searchData.value.major.find(e => e.nameCn === formData.value.major)?.id
-  formData.value.schoolId = searchData.value.school.find(e => e.value === formData.value.schoolName)?.key
-  try {
-    const startTime = convertYearMonthToTimestamp(formData.value.startTime)
-    const endTime = convertYearMonthToTimestamp(formData.value.endTime)
-    if (startTime > endTime) {
-      uni.showToast({ icon: 'none', title: '开始时间不能大于结束时间' })
-      return
-    }
-    await saveResumeEduExp({ ...formData.value, startTime, endTime })
-    uni.showToast({
-			icon: 'success',
-			title: '保存成功'
-		})
-		setTimeout(() => {
-      editId.value = null
-      uni.navigateBack({
-        delta: 1
-      })
-    }, 1000)
-  } catch (err) {
-		uni.showToast({
-			icon: 'none',
-			title: err.msg
-		})
-	}
-}
-
-// 删除
-const handleDelete = async () => {
-	try {
-		await deleteResumeEduExp(editId.value)
-		uni.showToast({
-			icon: 'success',
-			title: '删除成功'
-		})
-		setTimeout(() => {
-			editId.value = null
-			uni.navigateBack({
-				delta: 1
-			})
-		}, 1000)
-	} catch (err) {
-		uni.showToast({
-			icon: 'none',
-			title: err.msg
-		})
-	}
-}
-</script>
-
-<style lang="scss" scoped>
-</style>

+ 0 - 637
pagesA/resumeOnline/index.vue

@@ -1,637 +0,0 @@
-<template>
-  <layout-page>
-    <!-- 基本信息 -->
-    <view class="progress-box">
-      <view>简历完成度</view>
-      <progress
-        :percent="Number.isInteger(completeNum/7*100) ? (completeNum/7*100) : (completeNum/7*100).toFixed(2)"
-        show-info
-        border-radius="50"
-        activeColor="#00B760"
-        stroke-width="8"
-      />
-    </view>
-    <!-- <view class="topTip">
-      使用简历附件生成在线简历:
-      <text class="resumeAnalysisBtn" @tap="handleToResumeAnalysis">立即生成</text>
-    </view> -->
-    <view class="baseInfo borderLine" @tap="handleTo('baseInfoEdit')">
-      <view>
-        <view class="baseInfo-name">
-          <text class="name title">{{ baseInfo.name }}</text>
-          <uni-icons
-            type="icon-Edit"
-            color="#333"
-            custom-prefix="iconfont"
-            size="20"
-          ></uni-icons>
-        </view>
-        <view class="baseInfo-desc">{{ baseInfo.jobStatusText }}</view>
-        <view class="baseInfo-desc">{{ baseInfo.expTypeText ? baseInfo.expTypeText + ' - ' : '' }}{{ baseInfo.age ? baseInfo.age + '岁' : '' }}{{ baseInfo.eduTypeText ? ' - ' + baseInfo.eduTypeText : '' }}</view>
-        <view class="baseInfo-phone">
-          <uni-icons
-            type="icon-Phone"
-            color="#999"
-            custom-prefix="iconfont"
-            size="14"
-          ></uni-icons>
-          <text class="number">{{ baseInfo.phone }}</text>
-        </view>
-      </view>
-      <view class="head">
-        <image
-          :src="getUserAvatar(baseInfo?.avatar, baseInfo?.sex)"
-          mode="scaleToFill"
-        />
-      </view>
-    </view>
-    <!-- 个人画像 -->
-    <view class="characteristic borderLine">
-      <view class="titleBox">
-        <text class="title">个人画像</text>
-        <uni-icons
-          type="icon-Edit"
-          color="#666"
-          custom-prefix="iconfont"
-          size="18"
-          @tap="handleTo('portrait')"
-        ></uni-icons>
-      </view>
-      <view class="tags">
-        <view
-          v-for="tag in baseInfo.tagList"
-          :key="tag"
-          class="tag"
-        >
-          {{ tag }}
-        </view>
-      </view>
-    </view>
-    <!-- 个人优势 -->
-    <view class="advantage borderLine">
-      <view class="titleBox">
-        <text class="title">个人优势</text>
-        <uni-icons
-          type="icon-Edit"
-          color="#666"
-          custom-prefix="iconfont"
-          size="18"
-          @tap="handleTo('advantage')"
-        ></uni-icons>
-      </view>
-      <view class="ellipsis-2 text px-20">{{ baseInfo.advantage ? baseInfo.advantage : '请填写您的个人优势...' }}</view>
-    </view>
-    <!-- 求职意向 -->
-    <view class="intention borderLine">
-      <view class="titleBox">
-        <text class="title">求职意向</text>
-        <uni-icons
-          type="icon-add"
-          color="#666"
-          custom-prefix="iconfont"
-          size="18"
-          @tap="handleTo('jobIntention')"
-        ></uni-icons>
-      </view>
-      <view class="content">
-        <view class="text" v-if="!intention.length">请填写您的求职意向...</view>
-        <uni-list :border="false">
-          <uni-list-item
-            v-for="int in intention"
-            :key="int.id"
-            :border="false"
-            :clickable="true"
-            showArrow
-            @click="handleTo('jobIntention', int.id)"
-          >
-            <template v-slot:body>
-              <view class="item">
-                <view class="item-title">{{ int.jobTypeName}}</view>
-                <view>
-                  <text class="mr-20">{{ int.position}}</text>
-                  <text>{{ int.payFrom }} {{ int.payFrom  && int.payTo ? '-' : ''}} {{ int.payTo}}</text>
-                </view>
-                <view>{{ int.interestedArea && int.interestedArea.length ? int.workArea + ',' + int.interestedArea.map(e => e.name).join(',') : int.workArea }}</view>
-                <view class="item-tags">
-                  <view v-for="industry in int.industry" :key="industry.id" class="tag">{{ industry.nameCn }}</view>
-                </view>
-              </view>
-            </template>
-          </uni-list-item>
-        </uni-list>
-      </view>
-    </view>
-    <!-- 教育经历 -->
-    <view class="educationExp borderLine">
-      <view class="titleBox">
-        <text class="title">教育经历</text>
-        <uni-icons
-          type="icon-add"
-          color="#666"
-          custom-prefix="iconfont"
-          size="18"
-          @tap="handleTo('educationExp')"
-        ></uni-icons>
-      </view>
-      <view class="content">
-        <view class="text" v-if="!educationExp.length">请填写您的教育经历...</view>
-        <uni-list :border="false">
-          <uni-list-item
-            v-for="education in educationExp"
-            :key="education.id"
-            showArrow
-            :border="false"
-            :clickable="true"
-            :title="education.schoolName"
-            :note="`${education.major} ${education.educationTypeText}`"
-            :rightText="education.time"
-            @click="handleTo('educationExp', education.id)"
-          />
-        </uni-list>
-      </view>
-    </view>
-    <!-- 工作经历 -->
-    <view class="workExp borderLine">
-      <view class="titleBox">
-        <text class="title">工作经历</text>
-        <uni-icons
-          type="icon-add"
-          color="#666"
-          custom-prefix="iconfont"
-          size="18"
-          @tap="handleTo('workExperience')"
-        ></uni-icons>
-      </view>
-      <view class="content">
-        <view
-          v-for="work in workExp"
-          :key="work.id"
-          class="content-item"
-          @tap="handleTo('workExperience', work.id)"
-        >
-          <view class="content-title">
-            <view class="name">{{ work.enterpriseName }}</view>
-            <view class="time">
-              {{ work.time }}
-              <uni-icons
-                class="icon"
-                type="right"
-                color="#aaa"
-                size="16"
-              />
-            </view>
-          </view>
-          <view class="content-subTitle">{{ work.positionName }}</view>
-          <view class="content-main ellipsis-2">内容:{{ work.content }}</view>
-        </view>
-      </view>
-    </view>
-    <!-- 培训经历 -->
-    <view class="workExp trainExp borderLine">
-      <view class="titleBox">
-        <text class="title">培训经历</text>
-        <uni-icons
-          type="icon-add"
-          color="#666"
-          custom-prefix="iconfont"
-          size="18"
-          @tap.stop="handleTo('trainingExperience')"
-        ></uni-icons>
-      </view>
-      <view class="content">
-        <view
-          v-for="train in trainExp"
-          :key="train.id"
-          class="content-item"
-          @tap.stop="handleTo('trainingExperience', train.id)"
-        >
-          <view class="content-title">
-            <view class="name">{{ train.orgName }}</view>
-            <view class="time">
-              {{ train.time }}
-              <uni-icons
-                class="icon"
-                type="right"
-                color="#aaa"
-                size="16"
-              />
-            </view>
-          </view>
-          <view class="content-subTitle">课程:{{ train.course }}</view>
-          <view class="content-main ellipsis-2">描述:{{ train.content }}</view>
-        </view>
-      </view>
-    </view>
-    <!-- 职业技能 -->
-    <view class="characteristic">
-      <view class="titleBox">
-        <text class="title">职业技能</text>
-        <uni-icons
-          type="icon-Edit"
-          color="#666"
-          custom-prefix="iconfont"
-          size="18"
-          @tap.stop="handleTo('vocationalSkills')"
-        ></uni-icons>
-      </view>
-      <view class="tags">
-        <view
-          v-for="skill in skillExp"
-          :key="skill.title"
-          class="tag"
-        >
-          {{ skill.title }}
-        </view>
-      </view>
-    </view>
-  </layout-page>
-</template>
-
-<script setup>
-import { ref } from 'vue'
-import { getAgeByBirthdayTimestamp, timesTampChange } from '@/utils/date'
-import {
-  getResumeJobInterested,
-  getResumeEduExp,
-  getResumeWorkExp,
-  getResumeTrainExp,
-  getResumePersonSkill
-} from '@/api/resume'
-import { getText } from '@/utils/getText'
-import { getDict } from '@/hooks/useDictionaries'
-import { userStore } from '@/store/user'
-import { dealJobData } from './dict'
-import layoutPage from '@/layout'
-import { onShow } from '@dcloudio/uni-app'
-import { getUserAvatar } from '@/utils/avatar'
-
-const useUserStore = userStore()
-
-const baseInfo = ref({})
-const intention = ref([])
-const educationExp = ref([])
-const workExp = ref([])
-const trainExp = ref([])
-const skillExp = ref([])
-// 简历完成度
-const completeNum = ref(0)
-
-function handleTo (str, id) {
-  uni.navigateTo({ url: id ? `/pagesA/resumeOnline/${str}?id=${id}` : `/pagesA/resumeOnline/${str}` })
-}
-
-function handleToResumeAnalysis () {
-  uni.navigateTo({ url: '/pagesA/resumeAnalysis/index' })
-}
-
-// 获取基础信息
-function getBaseInfo () {
-  const { name, phone, ...obj } = useUserStore.baseInfo
-  baseInfo.value = {
-    ...obj,
-    name: name ? name : useUserStore.userInfo.phone,
-    phone: phone ? phone : useUserStore.userInfo.phone,
-    age: obj.birthday ? getAgeByBirthdayTimestamp(obj.birthday) : 0
-  }
-  if (useUserStore.userInfo && Object.keys(useUserStore.userInfo).length) completeNum.value++
-  if (baseInfo.value?.advantage ) completeNum.value++
-}
-
-// 获取求职意向
-async function getJobInterested () {
-  intention.value = []
-  const { data } = await getResumeJobInterested()
-  if (!data || !data.length) {
-    return
-  }
-  completeNum.value++ // 完成度展示
-  intention.value = dealJobData(data)
-}
-
-// 获取教育经历
-async function getEduExp () {
-  educationExp.value = []
-  const { data: dict } = await getDict('menduner_education_type')
-  if (dict.code !== 0) {
-    return
-  }
-  const { data } = await getResumeEduExp()
-  if (!data || !data.length) {
-    return
-  }
-  completeNum.value++ // 完成度展示
-  educationExp.value = data.map(e => {
-    const item = dict.data.find(_e => _e.value === e.educationType)
-    return {
-      ...e,
-      educationTypeText: item?.label ?? '',
-      time: `${timesTampChange(e.startTime ,'Y-M')}-${timesTampChange(e.endTime ,'Y-M')} `
-    }
-  })
-}
-
-// 获取工作经验
-async function getWorkExp () {
-  workExp.value = []
-  const { data } = await getResumeWorkExp()
-  if (!data || !data.length) {
-    return
-  }
-  completeNum.value++ // 完成度展示
-  workExp.value = data.map(e => {
-    return {
-      ...e,
-      time: `${timesTampChange(e.startTime ,'Y-M')}-${e.endTime ? timesTampChange(e.endTime ,'Y-M') : '至今'} `
-    }
-  })
-}
-
-// 培训经历
-async function getTrainExpData () {
-  trainExp.value = []
-  const { data } = await getResumeTrainExp()
-  if (!data || !data.length) {
-    return
-  }
-  completeNum.value++ // 完成度展示
-  trainExp.value = data.map(e => {
-    return {
-      ...e,
-      time: `${timesTampChange(e.startTime ,'Y-M')}-${e.endTime ? timesTampChange(e.endTime ,'Y-M') : '至今'} `
-    }
-  })
-}
-
-// 职业技能
-async function getSkillExpData () {
-  skillExp.value = []
-  const { data: _skillList} = await getDict('skillList', {}, 'skillList')
-  const skillList = _skillList?.data
-  if (!skillList || !skillList.length) {
-    return
-  }
-
-  completeNum.value++ // 完成度展示
-  const { data: _skillLevelArr } = await getDict('menduner_skill_level')
-  const skillLevelArr = _skillLevelArr?.data
-  if (!skillLevelArr || !skillLevelArr.length) {
-    return
-  }
-
-  const { data } = await getResumePersonSkill()
-  if (!data || !data.length) {
-    return
-  }
-  skillExp.value = data.map(e => {
-    return {
-      ...e,
-      title: `${getText(e.skillId, skillList, 'nameCn', 'id')} / ${getText(e.level, skillLevelArr)}`
-    }
-  })
-}
-
-onShow(() => {
-  completeNum.value = 0
-  // 获取基础信息
-  getBaseInfo()
-  // 获取求职意向
-  getJobInterested()
-  // 获取教育经历
-  getEduExp()
-  // 获取工作经验
-  getWorkExp()
-  // 培训经历
-  getTrainExpData()
-  // 职业技能
-  getSkillExpData()
-})
-</script>
-
-<style lang="scss" scoped>
-$px: 30rpx;
-.borderLine {
-  border-bottom: 2rpx solid #f5f5f5;
-}
-.progress-box {
-  padding: 20rpx $px;
-}
-.title {
-  font-size: 40rpx;
-  font-weight: 600;
-}
-.flex-1 {
-  flex: 1;
-}
-.soloHeight {
-  height: 80rpx;
-  line-height: 80rpx;
-}
-.px-20 {
-  padding-left: 20rpx;
-  padding-right: 20rpx;
-  box-sizing: border-box;
-}
-.mr-20 {
-  margin-right: 20rpx;
-}
-.ellipsis-2 {
-  overflow: hidden;
-  display: -webkit-box;
-  text-overflow: ellipsis; //属性规定当文本溢出包含元素时发生的事情  text-overflow: clip|ellipsis|string; (修剪/省略号/指定字符串)
-  -webkit-line-clamp: 2;
-  -webkit-box-orient: vertical; //属性规定框的子元素应该被水平或垂直排列
-}
-.titleBox {
-  margin-bottom: 10rpx;
-  display: flex;
-  justify-content: space-between;
-}
-.text {
-  font-size: 28rpx;
-  color: #666;
-}
-.baseInfo {
-  padding: 20rpx $px;
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  &-name {
-    margin-bottom: 10rpx;
-    .name {
-      margin-right: 10rpx;
-    }
-  }
-  &-desc {
-    font-size: 28rpx;
-    color: #666;
-    margin-bottom: 10rpx;
-  }
-  &-phone {
-    font-size: 28rpx;
-    color: #666;
-    .number {
-      margin-left: 10rpx;
-    }
-  }
-  .head {
-    image {
-      width: 150rpx;
-      height: 150rpx;
-      border: 2rpx solid #ccc;
-      border-radius: 50%;
-    }
-  }
-}
-.advantage {
-  padding: $px;
-}
-
-.characteristic {
-  padding: $px;
-  .tags {
-    padding-top: $px;
-    display: flex;
-    flex-wrap: wrap;
-    .tag {
-      margin: 0 10rpx 10rpx 0;
-      border: 2rpx solid #00B760;
-      color: #00B760;
-      white-space: nowrap;
-      padding: 4rpx 10rpx;
-      border-radius: 10rpx;
-      font-size: 24rpx;
-    }
-  }
-}
-.intention,.educationExp,.workExp,.projectExp {
-  padding: $px;
-}
-.workExp {
-  .content {
-    &-item {
-      padding: $px 20rpx;
-    }
-    &-title {
-      display: flex;
-      justify-content: space-between;
-      .name {
-        // font-weight: 600;
-        font-size: 30rpx;
-        color: #333;
-      }
-      .time {
-        color: #999;
-        font-size: 24rpx;
-        display: flex;
-        align-items: center;
-        .icon {
-          margin-left: 20rpx;
-        }
-      }
-    }
-    &-subTitle {
-      font-size: 24rpx;
-      margin-top: 6rpx;
-      color: #999;
-    }
-    &-main {
-      margin-top: 20rpx;
-      font-size: 24rpx;
-      color: #999;
-    }
-  }
-}
-.intention {
-  .content {
-    .item {
-      font-size: 28rpx;
-      color: #666;
-      &-title {
-        color: #000;
-        font-weight: 600;
-      }
-      &-tags {
-        display: flex;
-        flex-direction: row;
-        flex-wrap: wrap;
-        .tag {
-          border: 2rpx solid #00B760;
-          color: #00B760;
-          padding: 4rpx 16rpx;
-          font-size: 24rpx;
-          margin: 10rpx 10rpx 0 0;
-          border-radius: 10rpx;
-        }
-      }
-    }
-  }
-}
-
-
-.popup {
-  padding: $px;
-  padding-bottom: 100rpx;
-  &-title {
-    width: 100%;
-    display: flex;
-    justify-content: space-between;
-    margin-bottom: $px;
-    font-size: 24rpx;
-    .title {
-      font-size: 36rpx;
-    }
-  }
-  &-content {
-    .box {
-      display: flex;
-      justify-content: space-between;
-      border-bottom: 2rpx solid #eee;
-      padding: $px 0;
-      font-size: 30rpx;
-      font-weight: 500;
-      color: #000;
-      &:last-of-type {
-        border-bottom: none;
-      }
-      &.active {
-        color: #00B760;
-        font-weight: 600;
-      }
-    }
-  }
-}
-
-.popupBox {
-  height: 90vh;
-  .handleBtnBox {
-    // padding: 0 $px;
-    display: flex;
-    justify-content: space-between;
-    view {
-      padding: calc($px / 2);
-      margin-right: calc($px / 2);
-    }
-    .save {
-      color: #00B760;
-    }
-    .close {
-      color: gray;
-    }
-  }
-  .popupContent {
-    padding: $px;
-    padding-bottom: 100rpx;
-  }
-}
-.topTip {
-  background-color: #f7f8fa;
-  color: #2f3640;
-  padding: 12px 20px;
-  margin: 20px 20rpx;
-  font-size: 14px;
-}
-.resumeAnalysisBtn {
-  text-decoration: underline;
-  color: #00B760;
-}
-</style>

+ 0 - 177
pagesA/resumeOnline/jobIntention.vue

@@ -1,177 +0,0 @@
-<!--  -->
-<template>
-  <view class="ss-m-x-30 ss-m-y-30">
-    <uni-forms ref="form" :modelValue="formData" :rules="rules" validateTrigger="bind">
-      <uni-forms-item label="期望岗位" name="positionId" required label-width="90px">
-				<uni-data-picker popup-title="请选择期望岗位" v-model="formData.positionId" :localdata="dictObj?.positionTreeData || []" :clear-icon="false" :map="{ text: 'nameCn', value: 'id'}"></uni-data-picker>
-			</uni-forms-item>
-      <uni-forms-item label="期望行业" name="industryIdList" required label-width="90px">
-				<m-select
-					label="请选择期望行业"
-					:items="dictObj?.industryTreeData || []"
-					item-label="nameCn"
-					item-value="id"
-					multiple
-					v-model="formData.industryIdList"
-				></m-select>
-				<!-- <uni-data-picker popup-title="请选择期望行业" v-model="formData.industryIdList" :localdata="dictObj?.industryTreeData || []" :clear-icon="false" :map="{ text: 'nameCn', value: 'id'}"></uni-data-picker> -->
-			</uni-forms-item>
-      <uni-forms-item label="最低薪资" name="payFrom" required label-width="90px">
-        <uni-number-box v-model="formData.payFrom" :min="1" :max="999999999" :step="1000" :width="150" @change="payChange"></uni-number-box>
-			</uni-forms-item>
-      <uni-forms-item label="最高薪资" name="payTo" required label-width="90px">
-        <uni-number-box v-model="formData.payTo" :min="payToMin" :max="999999999" :step="1000" :width="150"></uni-number-box>
-			</uni-forms-item>
-      <uni-forms-item label="求职类型" name="jobType" required label-width="90px">
-				<uni-data-picker popup-title="请选择求职类型" v-model="formData.jobType" :localdata="dictObj?.jobType || []" :clear-icon="false" :map="{ text: 'label', value: 'value'}"></uni-data-picker>
-			</uni-forms-item>
-      <uni-forms-item label="工作城市" name="workAreaId" required label-width="90px">
-				<uni-data-picker popup-title="请选择工作城市" v-model="formData.workAreaId" :localdata="dictObj?.areaTreeData || []" :clear-icon="false" :map="{ text: 'name', value: 'id'}"></uni-data-picker>
-			</uni-forms-item>
-      <uni-forms-item label="其它感兴趣的城市" name="interestedAreaIdList" label-width="90px">
-				<!-- <uni-data-picker popup-title="其它感兴趣的城市" v-model="formData.interestedAreaIdList" :localdata="dictObj?.areaTreeData || []" :clear-icon="false" :map="{ text: 'name', value: 'id'}"></uni-data-picker> -->
-				<m-select
-					label="请选择其它感兴趣的城市"
-					:items="dictObj?.areaTreeData || []"
-					item-label="name"
-					item-value="id"
-					multiple
-					v-model="formData.interestedAreaIdList"
-				>
-				</m-select>
-			</uni-forms-item>
-    </uni-forms>
-    <view class="f-horizon-center">
-      <button v-if="editId" size="default" class="delete-button commonBtnStyle" @click="handleDelete">删 除</button>
-      <button size="default" :class="{'save-button': editId, 'commonBtnStyle': editId, 'send-button': !editId}"  @click="submit">保 存</button>
-    </view>
-  </view>
-</template>
-
-<script setup>
-import { ref, unref } from 'vue'
-import { dictObj } from '@/utils/position.js'
-import { saveResumeJobInterested, getResumeJobInterested, deleteResumeJobInterested } from '@/api/resume.js'
-import { onLoad } from '@dcloudio/uni-app'
-import { cloneDeep } from 'lodash-es'
-import MSelect from '@/components/FilterList/select.vue'
-
-let formData = ref({ positionId: '', payFrom: 0, payTo: 0 })
-const form = ref()
-const editId = ref(null)
-
-// 获取求职意向
-async function getJobInterested (id) {
-  const { data } = await getResumeJobInterested()
-  if (!data || !data.length) {
-    return
-  }
-  const obj = data.find(k => k.id === id)
-	formData.value = cloneDeep(obj)
-	formData.value.interestedAreaIdList = obj.interestedAreaIdList.map(e => +e)
-	if (dictObj && dictObj?.areaTreeData) {
-		const type = typeof dictObj.areaTreeData[0].id
-		formData.value.workAreaId = type === 'string' ? obj.workAreaId.toString() : Number(obj.workAreaId)
-	}
-}
-
-onLoad((options) => {
-	if (options.id) {
-		editId.value = options.id
-		getJobInterested(options.id)
-	}
-})
-
-// 提交
-const submit = async () => {
-  const valid = await unref(form).validate()
-  if (!valid) return
-	// 后续做多选
-	// const query = {...formData.value, industryIdList: formData.value.industryIdList, interestedAreaIdList: formData.value.interestedAreaIdList}
-	try {
-		await saveResumeJobInterested(formData.value)
-		uni.showToast({
-			icon: 'success',
-			title: '保存成功'
-		})
-		setTimeout(() => {
-			editId.value = null
-			uni.navigateBack({
-				delta: 1
-			})
-		}, 1000)
-	} catch (err) {
-		uni.showToast({
-			icon: 'none',
-			title: err.msg
-		})
-	}
-}
-
-// 删除
-const handleDelete = async () => {
-	try {
-		await deleteResumeJobInterested(editId.value)
-		uni.showToast({
-			icon: 'success',
-			title: '删除成功'
-		})
-		setTimeout(() => {
-			editId.value = null
-			uni.navigateBack({
-				delta: 1
-			})
-		}, 1000)
-	} catch (err) {
-		uni.showToast({
-			icon: 'none',
-			title: err.msg
-		})
-	}
-}
-
-const rules = {
-	positionId:{
-		rules: [{required: true, errorMessage: '请选择期望岗位' }]
-	},
-	industryIdList:{
-		rules: [{required: true, errorMessage: '请选择期望行业' }]
-	},
-	payFrom:{
-		rules: [{required: true, errorMessage: '请输入薪资最低要求' }]
-	},
-	payTo:{
-		rules: [{required: true, errorMessage: '请输入薪资最高要求' }]
-	},
-	jobType:{
-		rules: [{required: true, errorMessage: '请选择求职类型' }]
-	},
-	workAreaId:{
-		rules: [{required: true, errorMessage: '请选择工作城市' }]
-	},
-}
-
-const payToMin = ref(1)
-const payChange = (val) => {
-  payToMin.value = val
-  if (val > formData.value.payTo) formData.value.payTo = val
-}
-</script>
-
-<style lang="scss" scoped>
-.content {
-	position: relative;
-	&-cover {
-		position: absolute;
-		width: 100%;
-		height: 100%;
-		left: 0;
-		top: 0;
-		z-index: 3;
-	}
-}
-:deep(.uni-forms-item__content) {
-	max-width: 100%;
-	overflow: hidden;
-}
-</style>

+ 0 - 131
pagesA/resumeOnline/portrait.vue

@@ -1,131 +0,0 @@
-<template>
-  <view class="box">
-    <!-- 已选中 -->
-    <view class="chose borderLine">
-      <view class="choseTitle">已选中标签</view>
-      <view class="tags">
-        <view
-          v-for="tag in select"
-          :key="tag"
-          class="tag"
-          style="color: orange; border: 2rpx solid orange;"
-          @tap="handleCancelSelect(tag)"
-        >
-          {{ tag }}
-          <uni-icons type="clear" size="16" color="#ea8d03"></uni-icons>
-        </view>
-      </view>
-    </view>
-    <!-- 选择项 -->
-    <view v-if="showTagList && tagList?.length" class="list">
-      <uni-collapse v-model="collapseOpen">
-        <uni-collapse-item
-          v-for="val in tagList" :key="val.id"
-          :name="val.id"
-          :title="val?.nameCn || '--'"
-        >
-          <view v-if="val?.children?.length" class="tags">
-            <view v-for="k in val.children" :key="k.id">
-              <view v-if="select.includes(k.nameCn)" class="tag" style="color: grey; border: 2rpx solid grey;">
-                <uni-icons type="plusempty" size="14" color="#00B760"></uni-icons>
-                {{ k?.nameCn || '--' }}
-              </view>
-              <view v-else class="tag" style="color: #00B760; border: 2rpx solid #00B760;" @tap="handleSelect(k.nameCn)">
-                <uni-icons type="plusempty" size="14" color="#00B760"></uni-icons>
-                {{ k?.nameCn || '--' }}
-              </view>
-            </view>
-          </view>
-        </uni-collapse-item>
-      </uni-collapse>
-    </view>
-    <view class="f-horizon-center">
-      <button type="primary" size="default" class="send-button"  @click="submit">提 交</button>
-    </view>
-  </view>
-</template>
-
-<script setup>
-import { getTagTreeDataApi, savePersonPortrait } from '@/api/user'
-import { ref } from 'vue'
-import { userStore } from '@/store/user'; const useUserStore = userStore()
-
-
-// 选择
-const handleSelect = (nameCn) => {
-  const result = select.value.includes(nameCn)
-  if (!result) return select.value.push(nameCn)
-  else select.value = select.value.filter(e => e !== nameCn)
-}
-
-// 删除
-const handleCancelSelect = (nameCn) => {
-  select.value = select.value.filter(e => e !== nameCn)
-}
-
-const select = ref([])
-// 获取基础信息
-function getBaseInfo () {
-  const baseInfo = useUserStore.baseInfo
-  select.value = baseInfo.tagList &&  baseInfo.tagList?.length ? baseInfo.tagList : []
-}
-
-// 获取基础信息
-getBaseInfo()
-
-const tagList = ref([])
-const collapseOpen = ref([])
-const showTagList = ref(false)
-// 获取标签字典数据
-const getTagList = async () => {
-  showTagList.value = false
-  const res = await getTagTreeDataApi({ type: 0 })
-  tagList.value = res?.data || []
-  collapseOpen.value = tagList.value?.map(e => e.id)
-  showTagList.value = true
-}
-getTagList()
-
-// 提交
-const submit = async () => {
-  await savePersonPortrait({ tagList: select.value })
-  uni.showToast({ title: '编辑成功', icon: 'success' })
-  await useUserStore.getInfo()
-  //
-  setTimeout(() => {
-		uni.navigateBack({
-			delta: 1,
-		})
-	}, 1000);
-}
-</script>
-
-<style lang="scss" scoped>
-$px: 30rpx;
-.borderLine {
-  border-bottom: 2rpx solid #f5f5f5;
-}
-.box {
-  padding: 20rpx $px;
-  .chose {
-    margin-bottom: $px;
-    .choseTitle {
-      margin-bottom: $px;
-    }
-  }
-  .tags {
-    padding: $px 0;
-    display: flex;
-    flex-wrap: wrap;
-    .tag {
-      margin: 0 15rpx 12rpx 0;
-      border: 2rpx 15rpx #00B760;
-      color: #00B760;
-      white-space: nowrap;
-      padding: 4rpx 10rpx;
-      border-radius: 10rpx;
-      font-size: 24rpx;
-    }
-  }
-}
-</style>

+ 0 - 134
pagesA/resumeOnline/trainingExperience.vue

@@ -1,134 +0,0 @@
-<!-- 培训经历 -->
-<template>
-  <view class="ss-m-x-30 ss-m-y-30">
-    <uni-forms ref="form" :modelValue="formData" :rules="rules" validateTrigger="bind" label-width="90px">
-      <uni-forms-item label="培训中心" name="orgName" required>
-				<uni-easyinput type="text" v-model="formData.orgName" placeholder="请输入内容"></uni-easyinput>
-			</uni-forms-item>
-      <uni-forms-item label="培训课程" name="course" required>
-				<uni-easyinput type="text" v-model="formData.course" placeholder="请输入内容"></uni-easyinput>
-			</uni-forms-item>
-      <uni-forms-item label="开始时间" name="startTime" required>
-				<picker mode="date" :value="formData.startTime" fields="month" :end="endDate" @change="e => formData.startTime = e.detail.value">
-					<view class="uni-input ss-m-t-20">{{ formData.startTime }}</view>
-				</picker>
-			</uni-forms-item>
-      <uni-forms-item label="结束时间" name="endTime" required>
-				<picker mode="date" :value="formData.endTime" fields="month" :end="endDate" @change="e => formData.endTime = e.detail.value">
-          <view class="uni-input ss-m-t-20">{{ formData.endTime }}</view>
-        </picker>
-			</uni-forms-item>
-      <uni-forms-item label="培训描述" name="content">
-				<uni-easyinput type="textarea" v-model="formData.content" autoHeight  placeholder="请输入内容"></uni-easyinput>
-			</uni-forms-item>
-    </uni-forms>
-    <view class="f-horizon-center">
-      <button v-if="editId" size="default" class="delete-button commonBtnStyle" @click="handleDelete">删 除</button>
-      <button size="default" :class="{'save-button': editId, 'commonBtnStyle': editId, 'send-button': !editId}"  @click="submit">保 存</button>
-    </view>
-  </view>
-</template>
-
-<script setup>
-import { ref, unref } from 'vue'
-import { convertYearMonthToTimestamp, timesTampChange } from '@/utils/date.js'
-import { saveResumeTrainExp, deleteResumeTrainExp, getResumeTrainExp } from '@/api/resume.js'
-import { onLoad } from '@dcloudio/uni-app'
-import { cloneDeep } from 'lodash-es'
-
-let formData = ref({
-  startTime: '2014-01',
-  endTime: '2018-01'
-})
-const editId = ref(null)
-const form = ref()
-const date = new Date()
-const endDate = date.getFullYear() + '-' + (date.getMonth() + 1) // 不可选时间
-
-const rules = {
-	orgName:{
-		rules: [{required: true, errorMessage: '请输入培训中心' }]
-	},
-	course:{
-		rules: [{required: true, errorMessage: '请输入培训课程' }]
-	},
-	startTime:{
-		rules: [{required: true, errorMessage: '请选择培训开始时间' }]
-	},
-  endTime:{
-		rules: [{required: true, errorMessage: '请选择培训结束时间' }]
-	}
-}
-const getTTrainExp = async (id) => {
-  const { data } = await getResumeTrainExp()
-  if (!data || !data.length) {
-    return
-  }
-  const obj = data.find(e => e.id == id)
-  formData.value = cloneDeep(obj)
-  formData.value.startTime = obj.startTime ? timesTampChange(obj.startTime, 'Y-M') : '2014-01'
-  formData.value.endTime = obj.endTime ? timesTampChange(obj.endTime, 'Y-M') : '2018-01'
-}
-
-onLoad((options) => {
-  if (options.id) {
-    editId.value = options.id
-    getTTrainExp(options.id)
-  }
-})
-
-// 保存
-const submit = async () => {
-  const valid = await unref(form).validate()
-  if (!valid) return
-	const startTime = convertYearMonthToTimestamp(formData.value.startTime)
-	const endTime = convertYearMonthToTimestamp(formData.value.endTime)
-	if (startTime > endTime) {
-    uni.showToast({ icon: 'none', title: '开始时间不能大于结束时间' })
-		return
-	}
-  try {
-		await saveResumeTrainExp({ ...formData.value, startTime, endTime })
-    uni.showToast({
-			icon: 'success',
-			title: '保存成功'
-		})
-		setTimeout(() => {
-      editId.value = null
-      uni.navigateBack({
-        delta: 1
-      })
-    }, 1000)
-  } catch (err) {
-		uni.showToast({
-			icon: 'none',
-			title: err.msg
-		})
-	}
-}
-
-// 删除
-const handleDelete = async () => {
-	try {
-		await deleteResumeTrainExp(editId.value)
-		uni.showToast({
-			icon: 'success',
-			title: '删除成功'
-		})
-		setTimeout(() => {
-			editId.value = null
-			uni.navigateBack({
-				delta: 1
-			})
-		}, 1000)
-	} catch (err) {
-		uni.showToast({
-			icon: 'none',
-			title: err.msg
-		})
-	}
-}
-</script>
-
-<style lang="scss" scoped>
-</style>

+ 0 - 158
pagesA/resumeOnline/vocationalSkills.vue

@@ -1,158 +0,0 @@
-<!-- 1职业技能 -->
-<template>
-  <view class="ss-m-x-30 ss-m-y-30">
-    <!-- 已选中 -->
-    <view class="chose borderLine">
-      <view class="choseTitle">当前职业技能</view>
-      <view class="tags">
-        <view
-          v-for="tag in skillExp"
-          :key="tag.id"
-          class="tag"
-          style="color: #00B760; border: 2rpx solid #00B760;"
-          @tap="handleDelete(tag.id)"
-        >
-          {{ tag.title }}
-          <uni-icons type="clear" size="16" color="#00B760"></uni-icons>
-        </view>
-      </view>
-    </view>
-
-    <uni-section title="新增" type="line">
-      <uni-forms ref="form" :modelValue="formData" :rules="rules" validateTrigger="bind" label-width="90px" class="ss-m-t-50">
-        <uni-forms-item label="技能名称" name="skillId" required>
-          <uni-data-picker :localdata="skill" v-model="formData.skillId" :map="{ text: 'nameCn', value: 'id' }" placeholder="技能名称" popup-title="请选择技能名称"></uni-data-picker>
-        </uni-forms-item>
-        <uni-forms-item label="熟练度" name="level" required>
-          <uni-data-picker :localdata="skillLevelArr" v-model="formData.level" :map="{ text: 'label', value: 'value' }" placeholder="熟练度" popup-title="请选择熟练度"></uni-data-picker>
-        </uni-forms-item>
-      </uni-forms>
-      <view class="f-horizon-center">
-        <button size="default" class="send-button" @click="submit">提 交</button>
-      </view>
-    </uni-section>
-  </view>
-</template>
-
-<script setup>
-import { ref, unref } from 'vue'
-import { saveResumePersonSkill, deleteResumePersonSkill, getResumePersonSkill, getSkillTree } from '@/api/resume.js'
-import { getDict } from '@/hooks/useDictionaries'
-import { getText } from '@/utils/getText'
-
-let formData = ref({})
-const form = ref()
-const rules = {
-	skillId:{
-		rules: [{required: true, errorMessage: '请选择技能名称' }]
-	},
-	level:{
-		rules: [{required: true, errorMessage: '请选择熟练度' }]
-	}
-}
-
-// 熟练度
-const skillLevelArr = ref([])
-getDict('menduner_skill_level').then(({ data }) => {
-  data = data.data?.length && data.data || []
-  skillLevelArr.value = data
-})
-const skillList = ref([])
-getDict('skillList', {}, 'skillList').then(({ data }) => {
-  data = data.data?.length && data.data || []
-  skillList.value = data
-})
-
-// 获取 职业技能选项
-const skill = ref([])
-const getSkillTreeFunc = async () => {
-  const { data } = await getSkillTree()
-  skill.value = data || []
-}
-getSkillTreeFunc()
-
-// 职业技能
-const skillExp = ref([])
-async function getSkillExpData () {
-  const { data } = await getResumePersonSkill()
-  if (!data || !data.length) {
-    return
-  }
-  skillExp.value = data.map(e => {
-    return {
-      ...e,
-      title: `${getText(e.skillId, skillList.value, 'nameCn', 'id')} / ${getText(e.level, skillLevelArr.value)}`
-    }
-  })
-}
-getSkillExpData()
-
-// 保存
-const submit = async () => {
-  const valid = await unref(form).validate()
-  if (!valid) return
-  try {
-    await saveResumePersonSkill(formData.value)
-    uni.showToast({
-			icon: 'success',
-			title: '新增成功'
-		})
-		setTimeout(() => {
-      getSkillExpData()
-    })
-  } catch (err) {
-		uni.showToast({
-			icon: 'none',
-			title: err.msg
-		})
-	}
-}
-
-// 删除
-const handleDelete = async (id) => {
-	try {
-		await deleteResumePersonSkill(id)
-		uni.showToast({
-			icon: 'success',
-			title: '删除成功'
-		})
-		setTimeout(() => {
-			getSkillExpData()
-		})
-	} catch (err) {
-		uni.showToast({
-			icon: 'none',
-			title: err.msg
-		})
-	}
-}
-</script>
-
-<style lang="scss" scoped>
-.borderLine {
-  border-bottom: 2rpx solid #f5f5f5;
-}
-.chose {
-  margin-bottom: 30rpx;
-  .choseTitle {
-    margin-bottom: 30rpx;
-  }
-}
-.tags {
-  padding: 30rpx 0;
-  display: flex;
-  flex-wrap: wrap;
-  .tag {
-    margin: 0 15rpx 12rpx 0;
-    border: 2rpx 15rpx #00B760;
-    color: #00B760;
-    white-space: nowrap;
-    padding: 4rpx 10rpx;
-    border-radius: 10rpx;
-    font-size: 24rpx;
-  }
-}
-:deep(.uni-section .uni-section-header__decoration) {
-  background-color: #00B760 !important;
-}
-</style>

+ 0 - 181
pagesA/resumeOnline/workExperience.vue

@@ -1,181 +0,0 @@
-<!-- 工作经历 -->
-<template>
-  <view class="ss-m-x-30 ss-m-y-30">
-    <uni-forms ref="form" :modelValue="formData" :rules="rules" validateTrigger="bind" label-width="90px">
-      <uni-forms-item label="企业名称" name="enterpriseName" required>
-				<uni-combox :candidates="enterpriseData" placeholder="企业名称" v-model="formData.enterpriseName" @input="handleSearchEnterprise"></uni-combox>
-			</uni-forms-item>
-      <uni-forms-item label="职位名称" name="positionName" required>
-				<uni-combox :candidates="positionData" placeholder="职位名称" v-model="formData.positionName"></uni-combox>
-			</uni-forms-item>
-      <uni-forms-item label="开始时间" name="startTime" required>
-				<picker mode="date" :value="formData.startTime" fields="month" :end="endDate" @change="e => formData.startTime = e.detail.value">
-					<view class="uni-input ss-m-t-20">{{ formData.startTime }}</view>
-				</picker>
-			</uni-forms-item>
-      <uni-forms-item label="结束时间" name="endTime" required>
-				<view class="d-flex">
-          <picker mode="date" :value="formData.endTime" :disabled="endDisabled" fields="month" :end="endDate" @change="e => formData.endTime = e.detail.value">
-            <view class="uni-input ss-m-t-20" :style="{'opacity': endDisabled ? '0.5' : '1'}">{{ formData.endTime }}</view>
-          </picker>
-          <uni-data-checkbox selectedColor="#00B760" class="ss-m-l-50 ss-m-t-14" multiple v-model="sofar" :localdata="[{ text: '至今', value: 1 }]" @change="handleChangeSofar"></uni-data-checkbox>
-        </view>
-			</uni-forms-item>
-      <uni-forms-item label="工作内容" name="content" required>
-				<uni-easyinput type="textarea" v-model="formData.content" autoHeight  placeholder="请输入内容"></uni-easyinput>
-			</uni-forms-item>
-    </uni-forms>
-    <view class="f-horizon-center">
-      <button v-if="editId" size="default" class="delete-button commonBtnStyle" @click="handleDelete">删 除</button>
-      <button size="default" :class="{'save-button': editId, 'commonBtnStyle': editId, 'send-button': !editId}"  @click="submit">保 存</button>
-    </view>
-  </view>
-</template>
-
-<script setup>
-import { ref, unref } from 'vue'
-import { convertYearMonthToTimestamp, timesTampChange } from '@/utils/date.js'
-import { enterpriseSearchByName, saveResumeWorkExp, deleteResumeWorkExp, getResumeWorkExp } from '@/api/resume.js'
-import { onLoad } from '@dcloudio/uni-app'
-import { cloneDeep } from 'lodash-es'
-import { getDict } from '@/hooks/useDictionaries.js'
-
-let formData = ref({
-  startTime: '2014-01',
-  endTime: '2018-01'
-})
-const sofar = ref([])
-const endDisabled = ref(false)
-const editId = ref(null)
-const enterpriseData = ref([])
-const positionData = ref([])
-const form = ref()
-const date = new Date()
-const endDate = date.getFullYear() + '-' + (date.getMonth() + 1) // 不可选时间
-const searchData = ref({
-  enterprise: [],
-  position: []
-})
-
-const rules = {
-	enterpriseName:{
-		rules: [{required: true, errorMessage: '请输入企业名称' }]
-	},
-	positionName:{
-		rules: [{required: true, errorMessage: '请输入职位名称' }]
-	},
-	startTime:{
-		rules: [{required: true, errorMessage: '请选择开始时间' }]
-	},
-  content:{
-		rules: [{required: true, errorMessage: '请输入工作内容' }]
-	}
-}
-const getExp = async (id) => {
-  const { data } = await getResumeWorkExp()
-  if (!data || !data.length) {
-    return
-  }
-  const obj = data.find(e => e.id == id)
-  formData.value = cloneDeep(obj)
-  formData.value.startTime = obj.startTime ? timesTampChange(obj.startTime, 'Y-M') : '2014-01'
-  if (!obj.endTime) {
-    endDisabled.value = true
-    formData.value.endTime = '2018-01'
-    sofar.value = [1]
-  } else formData.value.endTime = timesTampChange(obj.endTime, 'Y-M')
-  handleSearchEnterprise(obj.enterpriseName)
-}
-
-onLoad((options) => {
-  if (options.id) {
-    editId.value = options.id
-    getExp(options.id)
-  }
-})
-
-// 企业搜索
-const handleSearchEnterprise = (e) => {
-  if (!e) return enterpriseData.value = []
-  enterpriseSearchByName({ name: e }).then(res => {
-    searchData.value.enterprise = res.data
-    enterpriseData.value = res.data && res.data?.length ? res.data.map(e => e.value) : []
-  })
-}
-
-let positionTreeChildrenData = []
-getDict('positionTreeData', null, 'positionTreeData').then(({ data }) => {
-  data = data.data?.length && data.data || []
-  data.forEach(e => {
-    if (e?.children?.length) positionTreeChildrenData = positionTreeChildrenData.concat(e.children)
-  })
-  searchData.value.position = positionTreeChildrenData
-  positionData.value = positionTreeChildrenData.map(e => e.nameCn)
-})
-
-// 至今
-const handleChangeSofar = (e) => {
-  const value = e.detail.value.length ? e.detail.value[0] : ''
-  endDisabled.value = value ? true : false
-}
-
-// 保存
-const submit = async () => {
-  const valid = await unref(form).validate()
-  if (!valid) return
-  formData.value.enterpriseId = searchData.value.enterprise.find(e => e.value === formData.value.enterpriseName)?.key
-  formData.value.positionId = searchData.value.position.find(e => e.nameCn === formData.value.positionName)?.id
-
-  const startTime = convertYearMonthToTimestamp(formData.value.startTime)
-  const endTime = sofar.value.length ? null : convertYearMonthToTimestamp(formData.value.endTime)
-  if (!endTime && !sofar.value.length) return uni.showToast({ icon: 'none', title: '请选择结束时间' })
-  if (endTime && startTime > endTime) {
-    uni.showToast({ icon: 'none', title: '开始时间不能大于结束时间' })
-    return
-  }
-
-  try {
-		await saveResumeWorkExp({ ...formData.value, startTime, endTime })
-    uni.showToast({
-			icon: 'success',
-			title: '保存成功'
-		})
-		setTimeout(() => {
-      editId.value = null
-      uni.navigateBack({
-        delta: 1
-      })
-    }, 1000)
-  } catch (err) {
-		uni.showToast({
-			icon: 'none',
-			title: err.msg
-		})
-	}
-}
-
-// 删除
-const handleDelete = async () => {
-	try {
-		await deleteResumeWorkExp(editId.value)
-		uni.showToast({
-			icon: 'success',
-			title: '删除成功'
-		})
-		setTimeout(() => {
-			editId.value = null
-			uni.navigateBack({
-				delta: 1
-			})
-		}, 1000)
-	} catch (err) {
-		uni.showToast({
-			icon: 'none',
-			title: err.msg
-		})
-	}
-}
-</script>
-
-<style lang="scss" scoped>
-</style>

+ 0 - 151
pagesA/seenMe/index.vue

@@ -1,151 +0,0 @@
-<template>
-  <view class="defaultBgc ss-p-x-20" style="height: 100vh; position: relative;">
-    <scroll-view v-if="showList" class="scrollBox" scroll-y="true" @scrolltolower="loadingMore">
-      <view v-if="list.length > 0">
-        <view v-for="(item, index) in list" :key="index" class="ss-m-t-20" @click="jumpToEnterpriseDetail(item.enterprise.id)">
-          <view class="sub-li-bottom">
-            <view class="avatarBox">
-              <image class="r-avatar" :src="getUserAvatar(item.contact.avatar, item.contact.sex)"></image>
-            </view>
-            <view class="ss-m-l-30">
-              <span>{{ item.contact?.name }}</span>
-              <span class="ss-m-x-10" v-if="item.contact?.name && item.contact?.nameCn"> | </span>
-              <span>{{ item.post?.nameCn }}</span>
-            </view>
-          </view>
-          <view style="background-color: #fff; border-radius: 0 0 12px 12px;" class="ss-p-30">
-            <view class="d-flex align-center">
-              <image :src="item.enterprise.logoUrl" style="width: 50px; height: 50px;"></image>
-              <view style="flex: 1;" class="ss-m-l-30">
-                <view class="enterprise-name ellipsis">{{ formatName(item.enterprise.anotherName || item.enterprise.name) }}</view>
-                <!-- 行业规模 -->
-                <view class="ss-m-y-15 font-size-12">
-                  <span class="tag-gap color-666">
-                    <span>{{item.enterprise.industryName }}</span>
-                    <span class="ss-m-x-10" v-if="item.enterprise.industryName && item.enterprise.scaleName">|</span>
-                    <span>{{item.enterprise.scaleName }}</span>
-                  </span>
-                </view>
-                <!-- 标签 -->
-                <view>
-                  <uni-tag 
-                    v-for="(tag, i) in item.enterprise.tagList || []"
-                    :key="i"
-                    class="ss-m-r-10"
-                    :text="tag"
-                    inverted="false"
-                    size="mini"
-                    custom-style="background-color: #eef1f7;color:#7f828b;border-color:#eef1f7;"
-                  />
-                </view>
-                <view class="color-666 font-size-13 ss-m-t-20">查看时间:{{ timesTampChange(item.updateTime) }}</view>
-              </view>
-            </view>
-          </view>
-        </view>
-        <uni-load-more :status="status" />
-      </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>
-    </scroll-view>
-	<view v-else class="noviewlist">
-		<view v-if="userInfo?.vipExpireDate > Date.now() && !userInfo?.entitlement?.viewersList">
-			当前会员套餐的权益不包含谁关注我,<span class="text-line" @tap.stop="handleToBuyVip">点击去升级</span>
-		</view>
-		<view v-if="!userInfo?.vipExpireDate || (userInfo?.vipExpireDate && userInfo?.vipExpireDate < Date.now())">
-			谁关注我为会员权益内容,<span class="text-line" @tap.stop="handleToBuyVip">点击去开通</span>
-		</view>
-	</view>
-  </view>
-</template>
-
-<script setup>
-import { ref, computed } from 'vue'
-import { getInterestedMePage } from '@/api/user'
-import { dealDictObjData, jumpToEnterpriseDetail } from '@/utils/position'
-import { getUserAvatar } from '@/utils/avatar'
-import { timesTampChange } from '@/utils/date'
-import { formatName } from '@/utils/getText'
-import { userStore } from '@/store/user'
-import { onShow } from '@dcloudio/uni-app'
-
-const status = ref('more')
-const queryParams = ref({
-  pageNo: 1,
-  pageSize: 10
-})
-const useUserStore = userStore()
-const userInfo = computed(() => useUserStore?.userInfo)
-// 当前会员套餐是否可查看此模块
-const showList = computed(() => (new Date().getTime() < useUserStore?.userInfo?.vipExpireDate) && useUserStore?.userInfo?.entitlement?.viewersList)
-
-const list = ref([])
-const getList = async () => {
-  const res = await getInterestedMePage(queryParams.value)
-  const arr = res?.data?.list || []
-  if (arr?.length) {
-    arr.forEach(e => {
-      e.enterprise = dealDictObjData({}, e.enterprise)
-    })
-    list.value = list.value.concat(arr)
-  }
-  status.value = list.value?.length === +res.data.total ? 'noMore' : 'more'
-}
-
-onShow(() => {
-	// 有会员权益能查看才请求接口
-	if (showList.value) getList()
-})
-
-// 加载更多
-const loadingMore = () => { 
-  status.value = 'loading'
-  queryParams.value.pageNo++
-  getList()
-}
-
-// 跳转会员套餐
-const handleToBuyVip = () => {
-	uni.navigateTo({
-		url: '/pagesA/vipPackage/index'
-	})
-}
-</script>
-
-<style scoped lang="scss">
-.sub-li-bottom {
-  display: flex;
-  align-items: center;
-  background: linear-gradient(90deg, #f5fcfc 0, #fcfbfa 100%);
-  font-size: 13px;
-  padding: 5px 30rpx;
-  border-radius: 12px 12px 0 0;
-  .avatarBox {
-    max-width: 40px;
-    max-height: 40px;
-  }
-}
-.enterprise-name {
-  color: #333;
-  font-weight: bold;
-  font-size: 16px;
-  width: 70vw;
-  max-width: 70vw;
-}
-.noviewlist {
-	position: absolute;
-	top: 50%;
-	left: 50%;
-	width: 98%;
-	text-align: center;
-	transform: translate(-50%, -50%);
-	color: #666;
-}
-.text-line {
-	color: #00B760;
-	font-weight: bold;
-	padding-bottom: 2px;
-	border-bottom: 1px solid #00B760;
-}
-</style>

+ 0 - 174
pagesB/about/index.vue

@@ -1,174 +0,0 @@
-<template>
-  <view style="width: 100%; height: 100%;">
-    <view class="banner"></view>
-    <view class="white-bgc ss-p-x-20">
-      <view class="ss-p-b-30 ss-p-t-40">
-        <h1 class="title">公司简介</h1>
-        <p class="ss-m-b-10 ss-m-t-40 color-666">门墩儿是聚焦酒店及现代服务业人力资源技术与人才数据服务的互联网科技公司。</p>
-        <p class="color-666">通过一体化的人力资源运营技术平台,致力于为企业提供人力资源数据服务支持,同时基于数据与技术,为企业提供线上招聘、猎头、实习生及知识付费等全方位人力资源解决方案。</p>
-      </view>
-      <view class="d-flex box ss-m-t-30">
-        <view class="box-item" v-for="(val, i) in list" :key="i" :style="{'background-image': `url('${val.url}')`}">
-          <p class="ss-m-b-6">{{ val.title }}</p>
-          <p class="font-size-14 ss-p-t-6" style="border-top: 1px solid rgba(255, 255, 255, .5)">{{ val.desc }}</p>
-        </view>
-      </view>
-      <view class="ss-p-y-30">
-        <view class="line"></view>
-        <h1 class="title ss-m-t-30 ss-m-b-20">门墩儿合伙人</h1>
-        <view class="d-flex flex-column align-center">
-          <img src="https://minio.citupro.com/dev/menduner/consultant/simon.png" style="width: 230px; height: 280px;" alt="">
-          <p class="ss-m-t-4 ss-m-l-4 consultant-item__name">创始人 田森博士(Simon Tian)</p>
-        </view>
-        <img class="ss-m-t-80" src="https://minio.menduner.com/dev/menduner/team.jpg" alt="" style="width: 100%; height: 120px;">
-      </view>
-      <view class="ss-p-b-30">
-        <view class="line"></view>
-        <h1 class="title">学术和行业之声</h1>
-        <view class="ss-m-t-60">
-          <view v-for="(val, i) in introduce" :key="i" class="ss-p-y-30 bole-item">
-            <view class="left">
-              <img :src="val.avatar" style="width: 80px; height: 80px;" />
-            </view>
-            <view class="right">
-              <p class="font-size-18">{{ val.name }}</p>
-              <p class="font-size-14 ss-m-y-2">{{ val.job }}</p>
-              <p class="font-size-14">{{ val.company }}</p>
-              <p class="font-size-14 ss-m-t-10" v-html="val.desc"></p>
-            </view>
-          </view>
-        </view>
-      </view>
-    </view>
-  </view>
-</template>
-
-<script setup>
-const list = [
-  { title: '公司使命', desc: '成为中国酒店行业可信赖的人力资源科技公司。', url: 'https://minio.citupro.com/dev/menduner/home/introduct-bg-01.png' },
-  { title: '公司愿景', desc: '人力数据技术赋能人才发现,助力酒店企业提质增效,实现业务可持续成长。', url: 'https://minio.citupro.com/dev/menduner/home/introduct-bg-02.png' }
-]
-
-// 学术和行业之声
-const introduce = [
-  {
-    name: 'Professor Kaye Chon',
-    job: 'Dean and Chair Professor, and Walter Kwok Foundation Professor in International Hospitality Management,School of Hotel and Tourism Management',
-    company: 'The Hong Kong Polytechnic University',
-    avatar: 'https://minio.citupro.com/dev/menduner/home/about/%E5%9B%BE%E7%89%871.png',
-    desc: 'The unprecedented growth of hotel industry in China creates a huge demand for qualified workers for the industry. This platform is very much welcomed because it will provide a win-win solution to both the demand and supply side of the hospitality industry human capital.'
-  },
-  {
-    name: 'Benjamin Yan 严竹明',
-    job: 'Chairman',
-    company: 'Ruiyee Hospitality',
-    avatar: 'https://minio.citupro.com/dev/menduner/home/about/%E5%9B%BE%E7%89%872.png',
-    desc: '恭喜门墩儿成功上线。如何遴选优质酒店业人才一直是我们的一大难题,人才关乎企业未来,而门墩儿的人工智能、大数据等技术必将助我们一臂之力,用人问题从此迎刃而解。'
-  },
-  {
-    name: 'Thierry Brinte',
-    job: 'General Manager',
-    company: 'Gran Hotel Bristol by Kempinski',
-    avatar: 'https://minio.citupro.com/dev/menduner/home/about/%E5%9B%BE%E7%89%873.png',
-    desc: 'I wish to offer my congratulations to Simon and his teammates in launching this fully-dedicated talent career service and development social platform for the hotel industry in China. The platform will benefit both hotel professionals and hotel employers in their endeavors to find the right and qualified hotel talents to ensure successful hotel business operations.'
-  },
-  {
-    name: 'Emily Zhu 竺丽萍',
-    job: '总经理',
-    company: '杭州新侨饭店',
-    avatar: 'https://minio.citupro.com/dev/menduner/home/about/%E5%9B%BE%E7%89%874.png',
-    desc: '“有所为,有所不为”,只做专业领域,且只做专业领域的金字塔市场, 这是“门墩儿”平台的特点。既深谙买方市场的需求,又有卖方市场的广阔人脉,这是“门墩儿”平台的特长。“千军好买,一将难求”,作为酒店业主方,我们需要像“门墩儿”这样能提供“私人定制”服务的合作伙伴。我个人非常看好“门墩儿”平台的发展前景,Bravo !!'
-  },
-  {
-    name: 'Antony Platford',
-    job: 'Seasoned Hotelier',
-    company: 'Hotel and Tourism Consulting',
-    avatar: 'https://minio.citupro.com/dev/menduner/home/about/%E5%9B%BE%E7%89%875.png',
-    desc: 'I wish to congratulate Simon Tian on the establishment of Menduner. There is no doubt of the future success for this enterprise and its clients given the proven ability, <br/>skills and professional experience that Simon and his team can provide.'
-  },
-  {
-    name: '肖君 先生',
-    job: '高级运营副总裁',
-    company: '朗廷酒店集团中国区域',
-    avatar: 'https://minio.citupro.com/dev/menduner/home/about/%E5%9B%BE%E7%89%876.png',
-    desc: '门墩儿是专属于酒店行业的职业发展社交平台。希望能在这里携手更多志同道合的伙伴,<br/>追求我们共同的梦想。'
-  },
-  {
-    name: 'Nelson Li 李可',
-    job: '泛海酒店投资管理有限公司副总经理',
-    company: '武汉泛海费尔蒙酒店业主代表',
-    avatar: 'https://minio.citupro.com/dev/menduner/home/about/%E5%9B%BE%E7%89%877.png',
-    desc: '世界每时每刻都在发生变化,唯一不变的是我们对于这个行业的初心和热情。很高兴看到一群有梦想的酒店人为了遇见更好的自己,为了中国酒店业的未来勇敢的迈出了这一步…<br/>“精诚所至 金石为开”,愿“门墩儿”与中国酒店人共同成长,加油!'
-  },
-  {
-    name: 'Gerhard H. Zimmer',
-    job: 'President',
-    company: 'ZYG INC.',
-    avatar: 'https://minio.citupro.com/dev/menduner/home/about/%E5%9B%BE%E7%89%878.png',
-    desc: 'Simon, a very talented Hotelier who has made good use of his technical skills, combined with excellent human relations to provide a solid foundation for a most successful operation.'
-  },
-  {
-    name: 'Ann Leung 梁旭君',
-    job: '创始人',
-    company: '禾禾木文化发展有限公司',
-    avatar: 'https://minio.citupro.com/dev/menduner/home/about/%E5%9B%BE%E7%89%879.png',
-    desc: '找到对的门,认识对的人. 门墩儿,比酒店人更懂酒店人,从这里开启不同的圈层,<br/>打开职业生涯你不敢想象的可能!'
-  }
-]
-</script>
-
-<style scoped lang="scss">
-.line {
-  border-top: 1px solid #ccc;
-  width: 100%;
-  height: 1px;
-  margin: 30px 0;
-}
-.banner {
-  height: 150px;
-  background-image: url('https://minio.menduner.com/dev/menduner/about-banner.png');
-  background-position: center center;
-  background-repeat: no-repeat;
-  background-size: cover;
-}
-.title {
-  font-size: 19px;
-  font-weight: 400;
-  text-align: center;
-}
-.box {
-  width: 100%;
-  &-item {
-    width: 50%;
-    height: 120px;
-    border-radius: 8px;
-    background-position: center center;
-    background-repeat: no-repeat;
-    background-size: cover;
-    padding: 18px;
-    color: #fff;
-    &:nth-child(2n) {
-      margin-left: 40px;
-    }
-  }
-}
-.bole-item {
-  padding: 30px 0;
-  display: flex;
-}
-.left {
-  width: 90px;
-}
-.right {
-  font-size: 14px;
-  color: #666;
-  line-height: 2;
-  flex: 1;
-}
-.consultant-item__name {
-  font-family: FFScalaWebBold, Georgia, Utopia, Charter, serif;
-  font-weight: 700;
-  color: #4c4c4e;
-}
-</style>
-

+ 0 - 276
pagesB/companyDetail/index.vue

@@ -1,276 +0,0 @@
-<template>
-  <view class="ss-p-b-30">
-    <view class="mar p-tb ss-m-x-30">
-      <view class="f-horizon">
-        <image style="width: 80px; height: 80px;" :src="info.logoUrl || 'https://minio.citupro.com/dev/menduner/company-avatar.png'"></image>
-        <view class="f-straight ss-m-l-10" style="flex: 1;position: relative;">
-          <view class="title-des font-weight-bold" style="max-width: 60vw;">{{ formatName(info.anotherName || info.name) }}</view>
-          <view class="color-999 ellipsis font-size-14" style="max-width: 60vw;">
-            <span>{{ !!info.industryName? info.industryName : ''}}</span>
-            <span class="ss-m-x-10" v-if="info?.industryName && info?.scaleName"> | </span>
-            <span>{{ info.scaleName || '' }}</span>
-          </view>
-          <view class="collect-icon" @click="handleFollow">
-            <uni-icons :type="isCollection ? 'heart-filled' : 'heart'" color="#fc6d5e" size="25"></uni-icons>
-          </view>
-        </view>
-      </view>
-    </view>
-
-    <view class="ss-m-t-30" style="background-color: #fff;">
-      <uni-segmented-control :current="current" :values="items" @clickItem="changeControl" styleType="text" activeColor="#00B760"></uni-segmented-control>
-    </view>
-
-    <view v-if="current === 0" style="height: 20rpx; background-color: #f8f8fa;"></view>
-
-    <!-- 企业信息 -->
-    <view v-if="current === 0" class="ss-m-t-30 ss-m-x-30 ss-p-b-30">
-      <span v-for="(tag, i) in info.tagList" :key="i" class="ss-m-r-10 ss-m-b-10" style="display: inline-block;">
-        <uni-tag :text="tag" inverted="false" size="default" custom-style="background-color: #eef1f7;color:#7f828b;border-color:#eef1f7; display: inline-block;"/>
-      </span>
-      <!-- 简介 -->
-      <view class="ss-m-t-30">
-        <h4>企业简介</h4>
-        <view v-if="info.introduce" class="ss-m-t-20" style="color: #606371;" v-html="info.introduce?.replace(/\n/g, '</br>')"></view>
-        <view v-else></view>
-      </view>
-      <!-- 福利标签 -->
-      <view class="topLine"></view>
-      <view >
-        <h4>企业福利标签</h4>
-        <view class="ss-m-t-20" v-if="info?.welfareList?.length">
-          <span v-for="(tag, i) in info.welfareList" :key="i" class="ss-m-r-10 ss-m-b-10" style="display: inline-block;">
-            <uni-tag :text="tag" inverted="false" size="default" custom-style="background-color: #eef1f7;color:#7f828b;border-color:#eef1f7; display: inline-block;"/>
-          </span>
-        </view>
-        <view v-else></view>
-      </view>
-      <!-- 网址 -->
-      <view class="topLine"></view>
-      <view>
-        <h4>企业网址</h4>
-        <view class="ss-m-t-20">
-          <uni-link v-if="info.website" :href="info.website" :text="info.website" color="#00B760"></uni-link>
-          <view v-else></view>
-        </view>
-      </view>
-      <view class="topLine"></view>
-      <!-- 工商信息 -->
-      <view>
-        <h4>工商信息</h4>
-        <view v-if="info.business && Object.keys(info.business).length">
-          <view class="ss-m-y-15" v-for="k in business" :key="k.value">
-            <view>{{ k.name }}</view>
-            <view class="color-666 ss-m-t-5">
-              {{ info.business[k.value] ? k.value === 'establishmentTime' ? timesTampChange(info.business[k.value], 'Y-M-D') : info.business[k.value] : '' }}
-            </view>
-          </view>
-        </view>
-        <view v-else></view>
-      </view>
-      <!-- 地址 -->
-      <view class="topLine"></view>
-      <view>
-        <h4>企业地址</h4>
-        <view class="ss-m-t-20" v-if="info?.business?.address">
-          <uni-icons type="map-pin-ellipse" color="#00B760" size="20"></uni-icons>
-          <span class="color-666 font-size-15">{{ info?.business?.address }}</span>
-        </view>
-        <view v-else></view>
-      </view>
-      <view class="topLine"></view>
-      <!-- 企业相册 -->
-      <view>
-        <h4>企业相册</h4>
-        <view class="ss-m-t-20" v-if="info?.albumList">
-          <swiper class="swiper-box" :indicator-dots="true" indicator-active-color="#fff">
-            <swiper-item v-for="(item ,index) in info?.albumList" :key="index" style="overflow-x:hidden;overflow-y: auto;">
-              <image v-if="checkIsImage(item)" class="ac-imgs" :src="item" @click="previewImage(index)"></image>
-              <video v-else :id="'albumListVideo'+index" class="ac-imgs" :src="item" @error="videoErrorCallback" controls></video>
-            </swiper-item>
-          </swiper>
-        </view>
-        <view v-else></view>
-      </view>
-    </view>
-
-    <!-- 招聘岗位 -->
-    <view v-if="current == 1">
-      <scroll-view class="scrollBox defaultBgc" scroll-y="true" @scrolltolower="loadingMore">
-        <view v-if="positionList.length > 0">
-          <PositionList class="pb-10" :list="positionList" :noMore="false"></PositionList>
-          <uni-load-more :status="status" />
-        </view>
-        <view v-else class="nodata-img-parents">
-          <image src="https://minio.citupro.com/dev/static/nodata.png" mode="widthFix" class="nodata-img-child"></image>
-        </view>
-      </scroll-view>
-    </view>
-  </view>
-</template>
-
-<script setup>
-import { ref } from 'vue'
-import { onLoad, onShareAppMessage, onShareTimeline } from '@dcloudio/uni-app'
-import { getEnterpriseDetails, enterpriseClick, getEnterpriseSubscribeCheck, getEnterpriseUnsubscribe, getEnterpriseSubscribe } from '@/api/user'
-import { dealDictObjData } from '@/utils/position'
-import { timesTampChange } from '@/utils/date'
-import { getJobAdvertisedSearch } from '@/api/position'
-import { getAccessToken } from '@/utils/request'
-import PositionList from '@/components/PositionList'
-import { checkIsImage } from '@/utils'
-import { formatName } from '@/utils/getText'
-
-const current = ref(0)
-const items = ['企业介绍', '招聘职位']
-const info = ref({})
-const id = ref(null)
-const title = ref('')
-const business = [
-  { name: '成立日期', value: 'establishmentTime' },
-  { name: '注册资金', value: 'registeredCapital' },
-  { name: '统一社会信用代码', value: 'code' },
-]
-const status = ref('more')
-const queryParams = ref({
-  pageNo: 1,
-  pageSize: 10,
-  enterpriseId: id.value
-})
-const positionList = ref([])
-
-// 预览
-const previewImage = (i) => {
-  uni.previewImage({
-    current: i,
-    urls: info.value.albumList
-  })
-}
-
-// 企业埋点
-const enterpriseClickFn = async () => {
-  if (!id.value) return
-  await enterpriseClick({ id: id.value })
-}
-enterpriseClickFn()
-
-// 效验求职者是否关注该企业
-const isCollection = ref(false)
-const getCollectionStatus = async () => {
-  if (!getAccessToken()) return isCollection.value = false
-  const data = await getEnterpriseSubscribeCheck({ enterpriseId: id.value })
-  isCollection.value = data.data
-}
-
-// 关注&取消关注企业
-const handleFollow = async () => {
-  if (!id.value) return
-  const api = isCollection.value ? getEnterpriseUnsubscribe : getEnterpriseSubscribe
-  await api(isCollection.value ? id.value : { enterpriseId: id.value })
-  getCollectionStatus()
-}
-
-// 企业详情
-const getData = async () => {
-  const { data } = await getEnterpriseDetails(id.value)
-  title.value = formatName(data.enterprise.anotherName || data.enterprise.name)
-  info.value = data.enterprise ? { ...data, ...dealDictObjData({}, data.enterprise) } : data
-  getCollectionStatus()
-}
-
-// 招聘职位列表
-const getPositionList = async () => {
-  queryParams.value.enterpriseId = id.value
-  const { data } = await getJobAdvertisedSearch(queryParams.value)
-  const list = data?.list || []
-  if (list?.length) {
-    list.forEach(e => {
-      e.job = { ...e.job, ...dealDictObjData({}, e.job) }
-      e.enterprise = { ...e.enterprise, ...dealDictObjData({}, e.enterprise)}
-    })
-    positionList.value = positionList.value.concat(list)
-  }
-  status.value = list?.length < queryParams.value.pageSize ? 'noMore' : 'more'
-}
-
-const loadingMore = () => {
-  status.value = 'loading'
-  queryParams.value.pageNo++
-  getPositionList()
-}
-
-onLoad(async (options) => {
-  id.value = options?.id || ''
-  if (id.value) await getData()
-})
-
-wx.showShareMenu({
-  withShareTicket: true,
-  menus: ['shareAppMessage', 'shareTimeline']
-})
-onShareAppMessage(() => {
-  if(!title.value){
-		setTimeout(() => {},1000)
-	}
-  return {
-    title: title.value || '门墩儿 专注顶尖招聘',
-    path: '/pagesB/companyDetail/index?id=' + id.value
-  }
-})
-onShareTimeline(() => {
-  if(!title.value){
-		setTimeout(() => {},1000)
-	}
-  return {
-    title: title.value || '门墩儿 专注顶尖招聘',
-    path: '/pagesB/companyDetail/index?id=' + id.value
-  }
-})
-
-const changeControl = (e) =>{
-  current.value = e.currentIndex
-  if (current.value === 0) getData()
-  else getPositionList()
-}
-const videoErrorCallback = (e) =>{
-  uni.showToast({
-    title: e?.target?.errMsg || '播放错误',
-    icon: 'none'
-  })
-}
-</script>
-
-<style scoped lang="scss">
-.title-des {
-  color: #0E100F;
-  font-size: 17px;
-  margin-right: 30px;
-  margin-top: 1px;
-  vertical-align: middle;
-  flex: 1;
-}
-.title-text{
-  font-weight: 700;
-  font-size: 18px;
-}
-.topLine {
-  border-top: 1px solid #EDEDED;
-  margin: 20px 0;
-}
-.swiper-box {
-	height: 29vh;
-}
-.ac-imgs{
-  width: 100%;
-  height: 29vh;
-  border-radius: 20px;
-}
-.collect-icon {
-  position: absolute;
-  top: 3px;
-  right: 10px;
-}
-.scrollBox {
-  height: 100vh;
-}
-</style>

+ 56 - 3
pagesB/contactUs/index.vue

@@ -1,11 +1,64 @@
 <template>
 <template>
-  <ContactUs :showTitle="false" />
+  <view class="main">
+    <view class="main-footer">
+      <uni-title type="h3" title="欢迎关注,了解门墩儿的新动态。"></uni-title>
+      <view class="subTitle">门墩儿在所有主流社交媒体都有账号。欢迎关注我们,以便了解关于发展趋势和领导力问题的最新见解。</view>
+      <view class="main-footer-contact">
+        <view class="main-footer-contact-item"><text>猎头顾问</text>:潘青海 Peter Pan</view>
+        <view class="main-footer-contact-item"><text>邮箱</text>:peter.pan@menduner.com</view>
+        <view class="main-footer-contact-item"><text>手机</text>:18621329797</view>
+        <view class="qr">
+          <image
+            src="https://minio.citupro.com/dev/menduner/official-account-code4.jpg"
+            mode="scaleToFill"
+          />
+          <view class="subTitle">关注menduner公众号</view>
+        </view>
+      </view>
+    </view>
+  </view>
 </template>
 </template>
 
 
 <script setup>
 <script setup>
-// 联系我们
-import ContactUs from '../headhunting/components/contact.vue'
 </script>
 </script>
 
 
 <style lang="scss" scoped>
 <style lang="scss" scoped>
+.main {
+  &-footer {
+    width: 100%;
+    padding: 30rpx;
+    box-sizing: border-box;
+    background: #f5f5f5;
+    .subTitle {
+      font-size: 24rpx;
+      margin-bottom: 20rpx;
+      line-height: 40rpx;
+      color: #666;
+    }
+    &-contact {
+      &-item {
+        margin-bottom: 20rpx;
+        text {
+          display: inline-block;
+          width: 140rpx;
+          text-align-last: justify;
+        }
+      }
+      
+    }
+    .qr {
+      image {
+        width: 240rpx;
+        height: 240rpx;
+        margin-bottom: 10rpx;
+      }
+      width: 100%;
+      display: flex;
+      justify-content: center;
+      flex-direction: column;
+      align-items: center;
+      margin-top: 20rpx;
+    }
+  }
+}
 </style>
 </style>

+ 0 - 72
pagesB/headhunting/components/contact.vue

@@ -1,72 +0,0 @@
-<template>
-  <view class="main">
-    <uni-title v-if="showTitle" type="h1" title="联系我们" align="center"></uni-title>
-    <view class="main-footer">
-      <uni-title type="h3" title="欢迎关注,了解门墩儿的新动态。"></uni-title>
-      <view class="subTitle">门墩儿在所有主流社交媒体都有账号。欢迎关注我们,以便了解关于发展趋势和领导力问题的最新见解。</view>
-      <view class="main-footer-contact">
-        <view class="main-footer-contact-item"><text>猎头顾问</text>:姚嘉庆 Julia Yao</view>
-        <view class="main-footer-contact-item"><text>邮箱</text>:Julia.yao@menduner.com</view>
-        <view class="main-footer-contact-item"><text>手机</text>:18501626969</view>
-        <view class="qr">
-          <image
-            src="https://minio.citupro.com/dev/menduner/official-account-code4.jpg"
-            mode="scaleToFill"
-          />
-          <view class="subTitle">关注menduner公众号</view>
-        </view>
-      </view>
-    </view>
-  </view>
-</template>
-
-<script setup>
-	defineProps({ 
-		showTitle: {
-			type: Boolean,
-			default: true
-		}
-	})
-
-</script>
-
-<style lang="scss" scoped>
-.main {
-  &-footer {
-    width: 100%;
-    padding: 30rpx;
-    box-sizing: border-box;
-    background: #f5f5f5;
-    .subTitle {
-      font-size: 24rpx;
-      margin-bottom: 20rpx;
-      line-height: 40rpx;
-      color: #666;
-    }
-    &-contact {
-      &-item {
-        margin-bottom: 20rpx;
-        text {
-          display: inline-block;
-          width: 140rpx;
-          text-align-last: justify;
-        }
-      }
-      
-    }
-    .qr {
-      image {
-        width: 240rpx;
-        height: 240rpx;
-        margin-bottom: 10rpx;
-      }
-      width: 100%;
-      display: flex;
-      justify-content: center;
-      flex-direction: column;
-      align-items: center;
-      margin-top: 20rpx;
-    }
-  }
-}
-</style>

+ 0 - 107
pagesB/headhunting/components/nav.vue

@@ -1,107 +0,0 @@
-<template>
-  <view class="main-top">
-    <view class="main-top-nav">
-      <view class="main-top-nav-logo" @tap="handleTo('/pagesB/headhunting/index')">
-        <image
-          src="https://minio.citupro.com/dev/menduner/poster.png"
-          mode="aspectFill"
-        />
-        <view class="gun"></view>
-        <text>中国</text>
-      </view>
-      <view class="main-top-nav-title">
-        <uni-icons :type="show ? 'closeempty' : 'bars'" color="#FFF" size="30" @tap="handleShow"/>
-      </view>
-    </view>
-    <view class="panel" :class="{active: show}">
-      <uni-list>
-        <uni-list-item class="panel-item" showArrow title="我们的服务" @tap="handleTo('/pagesB/headhunting/pages/service')" />
-        <uni-list-item class="panel-item" showArrow title="候选人" @tap="handleClick('/pages/index/position')"/>
-        <uni-list-item class="panel-item" showArrow title="联系我们" @tap="handleTo('/pagesB/headhunting/pages/contact')"/>
-      </uni-list>
-    </view>
-  </view>
-</template>
-
-<script setup>
-import { ref } from 'vue'
-const show = ref(false)
-
-
-const handleShow = () => {
-  show.value = !show.value
-}
-
-const handleClick = (path) => {
-  uni.switchTab({ url: path })
-}
-
-const handleTo = (path) => {
-  uni.navigateTo({ url: path })
-}
-</script>
-
-<style lang="scss" scoped>
-$rootColor: #00695c;
-.main-top {
-  position: sticky;
-  top: 0;
-  background: $rootColor;
-  z-index: 999;
-  &-nav {
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-    width: 100%;
-    height: 120rpx;
-    padding: 10rpx 20rpx;
-    box-sizing: border-box;
-    &-logo {
-      // width: 300rpx;
-      height: 100%;
-      display: flex;
-      align-items: center;
-      .gun {
-        height: 75rpx;
-        width: 6rpx;
-        background: #fff;
-        margin: 0 20rpx;
-      }
-      text {
-        color: #fff;
-        font-size: 32rpx;
-        font-weight: 600;
-      }
-      image {
-        width: 180rpx;
-        height: 75rpx;
-        // margin-bottom: 12rpx;
-      }
-    }
-
-    &-title {
-      height: 100%;
-      display: flex;
-      align-items: center;
-      color: #fff;
-    }
-    
-  }
-}
-.panel {
-  overflow: hidden;
-  height: 0;
-  transition: all 0.3s;
-  &.active {
-    height: auto;
-  }
-  &-item {
-    
-  }
-}
-:deep(.uni-list-item) {
-  background: #000 !important;
-  background-color: #000 !important;
-}
-
-</style>

+ 0 - 206
pagesB/headhunting/index.vue

@@ -1,206 +0,0 @@
-<template>
-  <view class="main">
-    <Nav></Nav>
-    <view class="main-header">
-      <!-- <uni-title type="h1" align="center" title="门墩儿猎头"></uni-title> -->
-      <view>我们深知卓越的领导力是企业业绩增长的关键。我们专注于为企业提供精准的人才洞见,助力企业在人才招聘、培养和晋升方面做出明智选择,从而优化高管团队的整体表现,推动企业持续发展。</view>
-    </view>
-    <view class="main-panel">
-        <view class="box" v-for="item in list" :key="item.title">
-          <text class="top">{{ item.title }}</text>
-          {{ item.desc }}
-        </view>
-      </view>
-    <view class="main-nav">
-      <view class="main-nav-item" v-for="item in service" :key="item.id" @tap="handleToDetails('service', item.id)">{{ item.title }}</view>
-    </view>
-    <view class="main-body">
-      <view>
-        <view class="title">依托在高管寻聘和领导力咨询方面的深厚专业知识,我们的顾问可进行跨行业、跨部门和跨地区的合作,以便更好地服务我们的客户。 我们帮助组织寻找和培养优秀的领导者,提高团队效力,支持战略或文化转型。</view>
-        <uni-title type="h1" title="我们的顾问" align="center"></uni-title>
-        <swiper
-          class="swiper"
-          circular
-          :indicator-dots="true"
-          :autoplay="true"
-          :interval="2000"
-          :duration="500"
-        >
-          <swiper-item v-for="item in consultant" :key="item.id" @tap="handleToDetails('consultant', item.id)">
-            <view class="swiper-item">
-              <image
-                :src="item.avatar"
-                mode="heightFix"
-              />
-              <text>{{ item.enName }}</text>
-            </view>
-          </swiper-item>
-        </swiper>
-      </view>
-      <view>
-        <uni-title type="h1" title="我们的办公地点" align="center"></uni-title>
-        <view class="main-body-office">
-          <view v-for="item in countryOffice" :key="item.name" class="main-body-office-item">
-            <image
-              :src="item.url"
-              mode="widthFix"
-            />
-            <view class="text">{{ item.name }}</view>
-          </view>
-        </view>
-      </view>
-    </view>
-    <Footer></Footer>
-  </view>
-</template>
-<!-- 猎头 -->
-<script setup>
-import Nav from './components/nav'
-import Footer from './components/contact.vue'
-// import { ref }  from 'vue'
-const consultant = [
-  { country: '苏州', enName: '田森博士(Simon Tian)', id: 'simon', avatar: 'https://minio.citupro.com/dev/menduner/consultant/simon.png' },
-  { country: '北京', enName: '潘青海先生(Peter Pan)', id: 'peter', avatar: 'https://minio.citupro.com/dev/menduner/consultant/peter.png' },
-  { country: '北京', enName: '姚嘉庆女士(Julia Yao)', id: 'julia', avatar: 'https://minio.citupro.com/dev/menduner/consultant/julie.png' }
-]
-// 数值示例
-const list = [
-  { title: '1500家+', desc: '服务企业' },
-  { title: '70%', desc: '拥有本科及以上学历人群' },
-  { title: '12种', desc: '涉及行业' }
-]
-// 服务
-const service = [
-  { title: '高级管理精英甄选', id: 'selection-senior-management-elite' },
-  { title: '人才发展储备策略', id: 'talent-development-reserve-strategy' },
-  { title: '管理者能力提升方案', id: 'manager-capability-enhancement-plan' },
-  { title: '卓越成长轨迹', id: 'excellent-growth-trajectory' },
-  { title: '高管信誉与资质验证', id: 'senior-management-elite-verification' },
-  { title: '多样化的人才网络', id: 'diversified-talent-network' }
-]
-// 办公地点
-const countryOffice = [
-  { name: '苏州', desc: '苏州识喜识谊信息科技有限公司', url: 'https://minio.menduner.com/dev/menduner/suzhou.png' },
-  { name: '北京', desc: '苏州识喜识谊信息科技有限公司', url: 'https://minio.menduner.com/dev/menduner/beijin.png' },
-  { name: '广州', desc: '苏州识喜识谊信息科技有限公司', url: 'https://minio.menduner.com/dev/menduner/guangzhou.png' }
-]
-const handleToDetails = (type, id) => {
-  uni.navigateTo({
-    url: `/pagesB/headhunting/pages/details?type=${type}&key=${id}`
-  })
-}
-</script>
-
-<style lang="scss" scoped>
-$rootColor: #00695c;
-.main {
-  
-  &-header {
-    width: 100%;
-    height: 300rpx;
-    background: url('https://minio.menduner.com/dev/menduner/banner.png') no-repeat;
-    background-position: center;
-    background-size: 100% 100%;
-    font-weight: 600;
-    font-size: 24rpx;
-    color: #FFF;
-    text-align: center;
-    padding: 0 40rpx;
-    line-height: 46rpx;
-    box-sizing: border-box;
-    position: relative;
-    display: flex;
-    align-items: center;
-    
-  }
-  &-panel {
-    margin: 20px 0;
-    height: 80rpx;
-    width: 100%;
-    // background: rgba(255, 255, 255, 0.5);
-    color: $rootColor;
-    // position: absolute;
-    // bottom: 0;
-    // left: 0;
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-    font-size: 20rpx;
-    margin: 20rpx 0;
-    .box {
-      flex: 1;
-      display: flex;
-      justify-content: center;
-      flex-direction: column;
-      font-weight: 600;
-      align-items: center;
-      .top {
-        font-size: 40rpx;
-      }
-    }
-  }
-  &-nav {
-    display: flex;
-    flex-wrap: wrap;
-    justify-content: space-around;
-    padding-top: 20rpx;
-    margin: 20px 0;
-    &-item {
-      width: 30%;
-      font-size: 20rpx;
-      color: $rootColor;
-      border: 1px solid $rootColor;
-      padding: 20rpx 0;
-      margin-bottom: 20rpx;
-      display: flex;
-      align-items: center;
-      justify-content: center;
-    }
-  }
-
-  &-body {
-    margin: 20px 0;
-    .title {
-      padding: 40rpx 30rpx;
-      text-align: center;
-      font-size: 24rpx;
-      background: rgba(0,0,0,.1);
-      color: $rootColor;
-    }
-    .swiper {
-      height: 600rpx;
-      &-item {
-        display: flex;
-        flex-direction: column;
-        // justify-content: center;
-        align-items: center;
-      }
-    }
-    &-office {
-      display: flex;
-      justify-content: space-around;
-      &-item {
-        width: 30%;
-        position: relative;
-        image {
-          width: 100%;
-        }
-        .text {
-          position: absolute;
-          top: 0;
-          left: 0;
-          width: 100%;
-          height: 100%;
-          display: flex;
-          align-items: center;
-          justify-content: center;
-          background: rgba(76, 76, 78, 0.6);
-          font-size: 36rpx;
-          font-weight: 600;
-          color: #FFF;
-        }
-      }
-    }
-  }
-}
-</style>

+ 0 - 71
pagesB/headhunting/pages/contact.vue

@@ -1,71 +0,0 @@
-<template>
-  <view class="pa-3">
-    <uni-forms ref="baseFormRef" v-model="baseFormData" validateTrigger="bind" :rules="rules" label-width="100px" label-align="right">
-      <uni-forms-item label="姓名" required  name="name">
-        <uni-easyinput v-model="baseFormData.name" placeholder="请输入姓名" />
-      </uni-forms-item>
-      <uni-forms-item label="联系手机号" required name="phone">
-        <uni-easyinput v-model="baseFormData.phone" placeholder="请输入联系手机号" />
-      </uni-forms-item>
-      <uni-forms-item label="企业名称" required name="enterpriseName">
-        <uni-easyinput v-model="baseFormData.enterpriseName" placeholder="请输入企业名称" />
-      </uni-forms-item>
-      <button type="primary" @click="submit" :disabled="loading">提交</button>
-    </uni-forms>
-  </view>
-</template>
-
-<script setup>
-import { ref, unref } from 'vue'
-import { huntSubmit } from '@/api/common'
-
-const baseFormRef = ref()
-const baseFormData = ref({
-  name: null,
-  phone: null,
-  enterpriseName: null
-})
-const rules = {
-  name: {
-    rules: [{
-      required: true,
-      errorMessage: '姓名不能为空'
-    }]
-  },
-  phone: {
-    rules: [{required: true, errorMessage: '请输入手机号码' }]
-  },
-  enterpriseName: {
-    rules: [{required: true, errorMessage: '请输入企业名称' }]
-  }
-}
-const loading = ref(false)
-const submit = async () => {
-  const valid = await unref(baseFormRef).validate()
-  if (!valid) return
-  loading.value = true
-  try {
-    const { code, msg } = await huntSubmit(baseFormData.value)
-    if (code !== 0) {
-      loading.value = false
-      uni.showToast({ title: msg, icon: 'none' })
-      return
-    }
-    uni.showToast({ title: '提交成功,我们会尽快与您联系', icon: 'none', success: () => {
-      setTimeout(() => {
-        loading.value = false
-        uni.navigateBack()
-      }, 1000)
-    } })
-  } catch (error) {
-    console.log('error', error)
-    loading.value = false
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-.pa-3 {
-  padding: 30rpx;
-}
-</style>

+ 0 - 105
pagesB/headhunting/pages/details.vue

@@ -1,105 +0,0 @@
-<template>
-  <view>
-    <template v-if="type === 'service' || type === 'industry'">
-      <uni-title type="h1" :title="data.title" align="center"></uni-title>
-      <view class="subTitle break">{{ data.startDesc }}</view>
-      <view v-if="data.children" class="pa-3">
-        <view v-for="item in data.children" :key="item" class="pa-2 subTitle">{{ item }}</view>
-      </view>
-      <view class="subTitle">{{ data.endDesc }}</view>
-    </template>
-    <template v-else-if="type === 'consultant'">
-      <view class="pa-3">
-        <view class="center mb-3">
-          <image
-            :src="data.avatar"
-            mode="heightFix"
-          />
-          <view class="title-job">{{ data.job }}</view>
-        </view>
-
-        <view class="name mb-3">{{ data.title }}</view>
-        <view class="tips mb-3">Consultant</view>
-        <view v-if="data?.edu" class="mb-3">
-          <view v-for="(edu, index) in data.edu" :key="index" class="mb-1 sub">{{ edu }}</view>
-        </view>
-        <view v-for="(k, i) in data.desc" :key="i" class="desc mb-3">{{ k }}</view>
-      </view>
-    </template>
-    <template v-else></template>
-    <Footer></Footer>
-  </view>
-</template>
-
-<script setup>
-import Footer from '../components/contact.vue'
-import { ref } from 'vue'
-import { onLoad } from '@dcloudio/uni-app'
-import { serviceData, consultantData } from '@/utils/headhuntingData'
-
-const data = ref({})
-const type = ref('service')
-
-onLoad((options) => {
-  type.value = options.type
-  const _data = {
-    service: serviceData,
-    consultant: consultantData,
-    industry: serviceData
-  }
-  data.value = _data[options.type].find(e => e.id === options.key)
-})
-</script>
-
-<style lang="scss" scoped>
-.title-job {
-  font-family: FFScalaWebItalic, Georgia, Utopia, Charter, sans-serif;
-  font-style: italic;
-  font-weight: 400;
-}
-.name {
-  font-family: FFScalaWebBold, Georgia, Utopia, Charter, sans-serif;
-  font-style: normal;
-  font-weight: 700;
-  font-size: 36rpx;
-  color: #00695C;
-}
-.tips {
-  font-family: FFScalaWebItalic, Georgia, Utopia, Charter, serif;
-  font-style: italic;
-  font-weight: 400;
-}
-.center {
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  flex-direction: column;
-}
-.pa-3 {
-  padding: 30rpx;
-}
-.pa-2 {
-  padding: 20rpx;
-}
-.mb-3 {
-  margin-bottom: 30rpx;
-}
-.mb-1 {
-  margin-bottom: 10rpx;
-}
-.break {
-  color: #333 !important;
-}
-.sub {
-  font-size: 28rpx;
-  color: #666;
-}
-.subTitle {
-  padding: 0 20rpx;
-  font-size: 24rpx;
-  margin-bottom: 20rpx;
-  line-height: 40rpx;
-  color: #666;
-}
-
-</style>

+ 0 - 135
pagesB/headhunting/pages/service.vue

@@ -1,135 +0,0 @@
-<template>
-  <view>
-    <Nav></Nav>
-    <view class="banner">
-      <text>Menduner aids corporate development through the strategy of precision talent selection.</text>
-    </view>
-    
-    <view class="box">
-      <uni-title type="h1" title="我们的服务" align="center"></uni-title>
-      <view class="subTitle">
-        我们深知卓越的领导力是企业业绩增长的关键。我们专注于为企业提供精准的人才洞见,助力企业在人才招聘、培养和晋升方面做出明智选择,从而优化高管团队的整体表现,推动企业持续发展。
-      </view>
-      <view class="box-main">
-        <view v-for="item in service" :key="item.id" class="content" @click="handleToDetails('service', item.id)">
-          <uni-title type="h4" :title="item.title"></uni-title>
-          <view class="subTitle">{{ item.desc }}</view>
-        </view>
-      </view>
-    </view>
-    <view class="box">
-      <view v-for="item in list" :key="item.title">
-        <uni-title type="h1" :title="item.title" align="center"></uni-title>
-        <view class="subTitle mb-3"> {{ item.desc }} </view>
-        <view class="subTitle mb-3"> {{ item.subDesc }} </view>
-        <view class="tapBox">
-          <text v-for="_item in item.items" :key="_item.id" class="tap" @tap="handleToDetails('industry', _item.id)">{{ _item.title }} </text>
-        </view>
-      </view>
-      
-    </view>
-  </view>
-</template>
-
-<script setup>
-import Nav from '../components/nav'
-// 我们的服务
-const service = [
-  { title: '高级管理精英甄选 >>', desc: '我们有能力挖掘具备卓越领导力、深远战略眼光及高效执行能力的行业翘楚。', active: false, id: 'selection-senior-management-elite' },
-  { title: '人才发展储备策略 >>', desc: '我们能协助企业构建系统化的人才培养与储备体系,确保组织持续拥有适应未来发展的高素质人才梯队。', id: 'talent-development-reserve-strategy' },
-  { title: '管理者能力提升方案 >>', desc: '我们将根据管理者的能力制定个性化提升方案,聚焦领导力、决策力与团队管理能力等综合提升,以实战培训与持续发展计划为核心。', id: 'manager-capability-enhancement-plan' },
-  { title: '卓越成长轨迹 >>', desc: '酒店职业经理人在持续学习、勇于挑战与不断自我超越中所展现出的非凡成长历程与成就路径。', active: false, id: 'excellent-growth-trajectory' },
-  { title: '高管信誉与资质验证 >>', desc: '是确保企业高层管理者具备专业能力、诚信品质与合法资质的综合评估过程。', active: false, id: 'senior-management-elite-verification' },
-  { title: '多样化的人才网络 >>', desc: '我们是人力资源一体化平台,涵盖不同背景、技能与经验的人才资源库,促进企业创新与多元化发展。', active: false, id: 'diversified-talent-network' }
-]
-const list = [
-  {
-    title: '我们服务的行业 - 酒店业',
-    desc: '我们致力于为酒店行业领域提供深度与广度兼具的服务,全面覆盖了酒店集团总部、业主公司、连锁酒店及公寓,以及单体酒店等多个关键层面。这不仅体现了对酒店行业多元化生态的深刻理解,更彰显了我们对于满足不同客户需求、推动行业发展的坚定承诺。',
-    subDesc: '我们全方位服务于酒店行业的多个细分领域,致力于为客户提供专业、高效且个性化的服务。我们坚信通过努力与付出将能够为酒店行业的繁荣发展贡献一份力量。',
-    items: [
-      { title: '酒店集团总部', id: 'hotel-group-headquarters' },
-      { title: '业主公司', id: 'owner-company' },
-      { title: '连锁酒店及公寓', id: 'chain-hotels-and-apartments' },
-      { title: '单体酒店', id: 'single-hotel' }
-    ]
-  },
-  {
-    title: '我们服务的行业 - 泛服务业',
-    desc: '在泛服务业的广阔天地里,我们正以前所未有的热情与智慧,推动着一系列关键领域的革新与进步。这些领域,包括新餐饮、邮轮产业、高端民宿、旅游及地产、体育与休闲业、会展业、医院与博物馆等,共同织就了一幅多元化高品质的服务业生态画卷。',
-    subDesc: '泛服务业的各个领域正以蓬勃的姿态,推动着经济的繁荣和社会的进步。未来,随着科技的不断进步和消费者需求的日益多样化,泛服务业将继续迎来新的发展机遇和挑战,我们期待着在这一广阔的舞台上,共同书写更加辉煌的篇章。',
-    items: [
-      { title: '新餐饮', id: 'new-catering' },
-      { title: '高端民宿', id: 'high-end-cottage' },
-      { title: '高端康养', id: 'high-end-consumption' },
-      { title: '会展业', id: 'exhibition-industry' },
-      { title: '游轮产业', id: 'cruise-industry' },
-      { title: '旅游及地产', id: 'tourism-and-real-estate' },
-      { title: '体育与休闲业', id: 'sports-and-leisure-industry' },
-      { title: '医院与博物馆', id: 'hospital-and-museum' }
-    ]
-  }
-]
-const handleToDetails = (type, id) => {
-  uni.navigateTo({
-    url: `/pagesB/headhunting/pages/details?type=${type}&key=${id}`
-  })
-}
-</script>
-
-<style lang="scss" scoped>
-
-$rootColor: #00695c;
-.mb-3 {
-  margin-bottom: 30rpx;
-}
-.banner {
-  width: 100%;
-  height: 400rpx;
-  line-height: 40rpx;
-  text-align: center;
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  padding: 40rpx;
-  box-sizing: border-box;
-  color: #fff;
-  background-image: url(https://minio.citupro.com/dev/menduner/headhunting/service-bg.jpg);
-  background-size: 100% 100%;
-  background-repeat: no-repeat;
-  background-position: center center;
-  font-family: FFScalaSansWebBold, Georgia, Utopia, Charter, sans-serif;
-  font-style: normal;
-}
-.box {
-  padding: 20rpx;
-  &-main {
-    padding: 20rpx;
-    
-    .content {
-      background: #f5f5f5;
-      padding: 0 20rpx 20rpx 20rpx;
-      margin-bottom: 20rpx;
-    }
-  }
-}
-.subTitle {
-  padding: 0 20rpx;
-  font-size: 24rpx;
-  margin-bottom: 20rpx;
-  line-height: 40rpx;
-  color: #666;
-}
-.tapBox {
-  display: flex;
-  flex-wrap: wrap;
-  justify-content: space-around;
-  padding-bottom: 30rpx;
-}
-.tap {
-  color: $rootColor;
-  font-size: 28rpx;
-  padding: 10rpx;
-  display: inline-block;
-}
-</style>

+ 0 - 115
pagesB/inviteRecord/index.vue

@@ -1,115 +0,0 @@
-<template>
-	<layout-page>
-		<scroll-view class="scrollBox" scroll-y="true" @scrolltolower="loadingMore" style="height: calc(100vh - 102rpx);">
-			<view v-if="total" class="totalShow">恭喜你,已经成功邀请{{ total }}个新用户啦!</view>
-      <view v-if="items.length" class="listBox">
-        <!-- <m-list :items="items"></m-list> -->
-				<uni-table ref="table" :loading="loading" border stripe emptyText="暂无更多数据" style="width: 100%;">
-					<uni-tr>
-						<uni-th width="100" align="center">用户名</uni-th>
-						<uni-th align="center">性别</uni-th>
-						<uni-th align="center">邀请时间</uni-th>
-					</uni-tr>
-					<uni-tr v-for="(item, index) in items" :key="index">
-						<uni-td align="center">{{ item.person?.name || item.user.phone }}</uni-td>
-						<uni-td align="center">{{ item.person?.sexName }}</uni-td>
-						<uni-td align="center">{{ item.user.createTime }}</uni-td>
-						<!-- <uni-td align="center">
-							<view class="uni-group">
-								<button class="uni-button" size="mini" type="warn">删除</button>
-							</view>
-						</uni-td> -->
-					</uni-tr>
-				</uni-table>
-        <uni-load-more :status="more" />
-      </view>
-      <view v-else class="nodata-img-parent">
-        <image
-          src="https://minio.citupro.com/dev/static/nodata.png"
-          mode="widthFix"
-          style="width: 100vw"
-        ></image>
-      </view>
-    </scroll-view>
-  </layout-page>
-</template>
-
-<script setup>
-import { ref, watch } from 'vue'
-import layoutPage from '@/layout'
-import { dealDictObjData } from '@/utils/position'
-import { timesTampChange } from '@/utils/date'
-
-// import MList from './list'
-// import { getDict } from '@/hooks/useDictionaries.js'
-import { getInviteRecord } from '@/api/position.js'
-// import { onLoad } from '@dcloudio/uni-app'
-
-import { userStore } from '@/store/user'
-const useUserStore = userStore()
-
-watch(() => useUserStore.refreshToken, (newVal, oldVal) => {
-  if (useUserStore.refreshToken) {
-		// 监听登录状态
-		console.log('重新登录了')
-	}
-})
-
-// 获取参数
-const pageInfo = ref({
-	pageNo: 1,
-	pageSize: 100
-})
-const total = ref(0)
-const items = ref([])
-const loading = ref(false)
-const more = ref('more')
-
-async function init () {
-	try {
-		loading.value = true
-		const res = await getInviteRecord({
-			...pageInfo.value,
-		})
-		const data = res?.data?.list || []
-		if (!data.length) {
-			pageInfo.value.pageNo--
-			return
-		}
-		const dealData = data.map(e => {
-			e.person = dealDictObjData({}, e.person)
-			if (e.user?.createTime) e.user.createTime = timesTampChange(e.user.createTime)
-			return e
-		})
-		items.value.push(...dealData)
-		total.value = items.value.length
-		more.value = items.value.length === total.value ? 'noMore' : 'more'
-	} catch (error) {
-		pageInfo.value.pageNo--
-	} finally {
-		loading.value = false
-	}
-}
-init()
-
-function loadingMore () {
-	if (total.value === items.value.length) {
-		return
-	}
-	if (loading.value) {
-		return
-	}
-	more.value = 'loading'
-  pageInfo.value.pageNo++
-	init()
-}
-</script>
-<style scoped lang="scss">
-.listBox {
-	padding: 30rpx;
-}
-.totalShow {
-	margin: 30rpx 0 0 30rpx;
-	color: #333;
-}
-</style>

+ 0 - 70
pagesB/inviteRecord/list.vue

@@ -1,70 +0,0 @@
-<template>
-	<view>
-		<view
-			class="list"
-			v-for="item in items"
-			:key="item.id"
-		>
-			<view class="list-top">
-				<text class="list-top-person">牛人:{{ item.sendPerson?.name }}</text>
-				<text class="list-top-time">{{ timesTampChange(item.createTime) }}</text>
-			</view>
-			<view class="list-remuneration">
-				薪酬:
-				{{ item.job?.payFrom }}
-				{{ item.job?.payFrom && item.job?.payTo ? ' - ' : '' }}
-				{{ item.job?.payTo }}
-			</view>
-			<view class="list-company">
-				<text>{{ formatName(item.enterprise?.anotherName || item.enterprise?.name) }}</text>
-				<text>{{ (item.enterprise?.anotherName || item.enterprise?.name) && item.job?.name ? ' · ' : '' }}</text>
-				<text>{{ formatName(item.job?.name) }}</text>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script setup>
-import { timesTampChange } from '@/utils/date'
-import { formatName } from '@/utils/getText'
-
-const props = defineProps({
-	items: {
-		type: Array,
-		default: () => []
-	}
-})
-</script>
-
-<style lang="scss" scoped>
-.list {
-	background: #FFF;
-	margin-top: 20rpx;
-	&-top {
-		padding: 20rpx;
-		display: flex;
-		justify-content: space-between;
-		align-items: center;
-		&-person {
-			font-size: .9em;
-			color: #333;
-		}
-		&-time {
-			font-size: .75em;
-			color: #999;
-		}
-	}
-	&-company {
-		padding: 30rpx 20rpx;
-		font-size: 28rpx;
-		color: #666;
-		background: linear-gradient(90deg, #f5fcfc 0, #fcfbfa 100%);
-	}
-	&-remuneration {
-		padding: 20rpx;
-		font-size: 28rpx;
-		color: #666;
-	}
-	
-}
-</style>

+ 0 - 162
pagesB/preferredGroup/index.vue

@@ -1,162 +0,0 @@
-<template>
-	<view v-if="Object.keys(preferred).length > 0" class="ss-p-x-20">
-		<!-- 轮播图 -->
-		<swiper
-      circular
-      :indicator-dots="preferred?.carousel?.length > 1 ? true : false"
-      :autoplay="true"
-      :interval="3000"
-      :duration="500"
-      indicator-active-color="#fff"
-	  	style="height: 180px;"
-    >
-			<swiper-item v-for="(item, index) in preferred.carousel" :key="index">
-        <image :src="item" style="width: 100%; height: 100%" :lazy-load="true" :fade-show="true"></image>
-			</swiper-item>
-		</swiper>
-		<!-- 集团简介 -->
-		<view class="ss-m-t-50">
-			<!-- 标题 -->
-			<uni-title class="ss-m-b-30" type="h1" :title="preferred?.introduce?.title" align="center"></uni-title>
-			<!-- 简介 -->
-			<rich-text class="ss-m-b-30 color-666" :nodes="preferred?.introduce?.describe"></rich-text>
-			<!-- 小图 -->
-			<swiper
-				v-if="preferred?.introduce?.thumbnail?.length"
-				circular
-				:indicator-dots="true"
-				:autoplay="true"
-				:interval="3000"
-				:duration="500"
-				indicator-active-color="#fff"
-				:style="{'height': preferred?.introduce?.thumbnail.length > 1 ? '240px' : '160px'}"
-				class="ss-m-t-50"
-			>
-				<swiper-item v-for="(item, index) in preferred.introduce?.thumbnail" :key="index">
-					<image :src="item" style="width: 100%; height: 100%" :lazy-load="true" :fade-show="true"></image>
-				</swiper-item>
-			</swiper>
-
-			<!-- 大图 -->
-			<image class="ss-m-y-30" :src="preferred.introduce?.bigPicture?.url" style="width: 100%;" :lazy-load="true" :fade-show="true" :style="{'height': preferred.introduce?.bigPicture?.height + 'px'}"></image>
-		</view>
-
-		<!-- 品牌介绍 -->
-		<view v-if="preferred?.brandIntroduce?.length" class="ss-m-t-30">
-			<uni-title class="ss-m-b-30 color-666" type="h1" title="品牌介绍" align="center"></uni-title>
-			<uni-swiper-dot class="uni-swiper-dot-box" :info="preferred.brandIntroduce" :current="current" mode="nav" field="content">
-				<swiper :autoplay="true" :interval="5000" class="swiper-box" @change="change" :current="swiperDotIndex" style="height: 172px;">
-					<swiper-item v-for="(item, index) in preferred.brandIntroduce" :key="index">
-						<image :src="item.url" style="width: 100%; height: 100%" :lazy-load="true" :fade-show="true"></image>
-						<view class="swiper-item" :class="'swiper-item' + index">
-							<text style="color: #fff; font-size: 20px;">{{ item.content }}</text>
-						</view>
-					</swiper-item>
-				</swiper>
-			</uni-swiper-dot>
-			<view class="color-666 ss-m-t-20 font-size-14">{{ preferred.brandIntroduce[current].desc }}</view>
-		</view>
-		
-		<!-- 招聘职位 -->
-		<view class="ss-m-t-50">
-			<uni-title class="ss-m-b-30 color-666" type="h1" title="招聘职位" align="center"></uni-title>
-			<scroll-view class="scrollBox defaultBgc" scroll-y="true" @scrolltolower="loadingMore">
-			  <view v-if="positionList.length > 0">
-			    <PositionList class="pb-10" :list="positionList" :noMore="false"></PositionList>
-			    <uni-load-more :status="status" />
-			  </view>
-			  <view v-else class="nodata-img-parents">
-			    <image src="https://minio.citupro.com/dev/static/nodata.png" mode="widthFix" class="nodata-img-child"></image>
-			  </view>
-			</scroll-view>
-		</view>
-	</view>
-</template>
-
-<script setup>
-import { ref } from 'vue'
-import { onLoad, onShareAppMessage, onShareTimeline } from '@dcloudio/uni-app'
-import { getJobAdvertisedSearch } from '@/api/position'
-import { dealDictObjData } from '@/utils/position'
-import { getWebContent } from '@/api/common'
-import PositionList from '@/components/PositionList'
-
-const title = ref('')
-const enterpriseId = ref(null)
-const preferred = ref({}) // 当前企业信息
-const preferredGroup = ref({}) // 优选集团信息
-
-const getSystemWebContent = async () => {
-  const { data } = await getWebContent()
-  preferredGroup.value = data?.appPreferredGroup || {}
-  if (!enterpriseId.value || !preferredGroup.value[enterpriseId.value]) return uni.navigateBack({ delta: 1 })
-  preferred.value = preferredGroup.value[enterpriseId.value]
-  title.value = preferred.value.title
-  uni.hideLoading()
-}
-
-onLoad(async (options) => {
-	uni.showLoading({ title: '加载中...', mask:true })
-	enterpriseId.value = options.id
-	await getSystemWebContent()
-	await getPositionList()
-})
-
-onShareAppMessage(() => {
-  if(!title.value) setTimeout(() => {},1000)
-  return {
-    title: title.value || '门墩儿 专注顶尖招聘',
-    path: '/pagesB/preferredGroup/index?id=' + enterpriseId.value
-  }
-})
-
-onShareTimeline(() =>{
-	if (!title.value) setTimeout(() => {}, 1000)
-	return {
-	  title: title.value || '门墩儿 专注顶尖招聘',
-	  path: '/pagesB/preferredGroup/index?id=' + enterpriseId.value
-	}
-})
-
-const current = ref(0)
-const swiperDotIndex = ref(0)
-const change = (e) => {
-  current.value = e.detail.current
-}
-
-// 招聘职位
-const status = ref('more')
-const queryParams = ref({
-  pageNo: 1,
-  pageSize: 10,
-  enterpriseId: ''
-})
-const positionList = ref([])
-
-// 招聘职位列表
-const getPositionList = async () => {
-  queryParams.value.enterpriseId = enterpriseId.value
-  const { data } = await getJobAdvertisedSearch(queryParams.value)
-  const list = data?.list || []
-  if (list?.length) {
-    list.forEach(e => {
-      e.job = { ...e.job, ...dealDictObjData({}, e.job) }
-      e.enterprise = { ...e.enterprise, ...dealDictObjData({}, e.enterprise)}
-    })
-    positionList.value = positionList.value.concat(list)
-  }
-  status.value = list?.length < queryParams.value.pageSize ? 'noMore' : 'more'
-}
-
-const loadingMore = () => {
-  status.value = 'loading'
-  queryParams.value.pageNo++
-  getPositionList()
-}
-</script>
-
-<style scoped lang="scss">
-.scrollBox {
-  height: 100vh;
-}
-</style>

+ 0 - 141
pagesB/recommendEnterprise/index.vue

@@ -1,141 +0,0 @@
-<template>
-  <view style="padding-bottom: 30px;">
-    <scroll-view scroll-y="true" @scrolltolower="loadingMore" style="height: 100vh;">
-      <view v-if="items.length">
-        <uni-card v-for="(val, index) in items" :key="index" :is-shadow="true" :border='false' shadow="0px 0px 3px 1px rgba(0,0,0,0.1)">
-          <view class="d-flex align-center" @click="jumpToEnterpriseDetail(val.enterprise.id)">
-            <image class="enterAvatar" :src="val.enterprise.logoUrl ? val.enterprise.logoUrl : 'https://minio.citupro.com/dev/menduner/company-avatar.png'"></image>
-            <view class="ss-m-l-20" style="flex: 1;">
-              <view class="font-size-16 enterpriseName">{{ formatName(val.enterprise.anotherName || val.enterprise.name) }}</view>
-              <view class="ss-m-t-5">
-                <span class="color-999">{{ val.enterprise?.industryName || '' }}</span>
-                <span class="divider tag-gap1" v-if="val.enterprise?.industryName && val.enterprise?.scaleName"> | </span>
-                <span class="color-999">{{ val.enterprise?.scaleName || '' }}</span>
-              </view>
-              <view class="ss-m-t-10">
-                <uni-tag 
-                  v-for="(tag,i) in val.enterprise?.welfareList || []"
-                  :key="i"
-                  class="tag-gap ss-m-r-5"
-                  :text="tag"
-                  inverted="false"
-                  size="mini"
-                  custom-style="background-color: #ececec; color: #666; border-color: #ececec; display: inline-block;"
-                />
-              </view>
-            </view>
-          </view>
-          <view class="line ss-m-y-20"></view>
-          <view>
-            <view class="list-shape" v-for="(k, i) in val.jobList" :key="k.id" @click="handleToPosition(k)" :style="{'padding-bottom': i !== val.jobList.length - 1 ? '10px' : ''}">
-              <view class="titleBox my-5">
-                <view class="job-name" :style="{'max-width': !k.payFrom && !k.payTo ? '65vw' : '50vw'}">{{ formatName(k.name) }}</view>
-                <span v-if="!k.payFrom && !k.payTo" class="salary-text">面议</span>
-                <span v-else class="salary-text">{{ k.payFrom }}-{{ k.payTo }}{{ k.payName ? '/' + k.payName : '' }}</span>
-              </view>
-              <view style="font-size: 13px;" class="ss-m-t-5">
-                <span class="tag-gap" style="color: #808080;">
-                  <span>{{ k.area?.str ?? '全国' }}</span>
-                  <span class="ss-m-x-10" v-if="k.eduName">|</span>
-                  <span>{{ k.eduName }}</span>
-                  <span class="ss-m-x-10" v-if="k.expName">|</span>
-                  <span>{{ k.expName }}</span>
-                </span>
-              </view>
-            </view>
-          </view>
-        </uni-card>
-        <uni-load-more :status="more" />
-      </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>
-    </scroll-view>
-  </view>
-</template>
-
-<script setup>
-import { ref }  from 'vue'
-import { getHotEnterprise } from '@/api/enterprise'
-import { dealDictObjData, dealDictArrayData, jumpToEnterpriseDetail } from '@/utils/position'
-import { formatName } from '@/utils/getText'
-
-const more = ref('more')
-const items = ref([])
-const query = ref({
-  pageNo: 1,
-  pageSize: 10
-})
-
-// 精选企业列表
-const getPopularEnterprise = async () => {
-  const { data } = await getHotEnterprise(query.value)
-  const list = data?.list || []
-  if (!list.length && query.value.pageNo === 1) {
-    items.value = []
-    return
-  }
-  if (list?.length) {
-    list.forEach(e => {
-      e.enterprise = dealDictObjData({}, e.enterprise)
-      if (e.jobList && e.jobList.length) e.jobList = dealDictArrayData([], e.jobList).slice(0, 2)
-    })
-    items.value = items.value.concat(list)
-  }
-  more.value = items.value.length === +data.total ? 'noMore' : 'more'
-}
-getPopularEnterprise()
-
-// 加载更多
-const loadingMore = () => {
-  more.value = 'loading'
-  query.value.pageNo++
-  getPopularEnterprise()
-}
-
-// 职位详情
-const handleToPosition = (k) => {
-  const url = `/pagesB/positionDetail/index?id=${k.id}&area=${k.area?.str ?? '全国'}`
-  uni.navigateTo({ url })
-}
-
-</script>
-
-<style scoped lang="scss">
-.enterpriseName {
-  color: #0E100F;
-  font-weight: 700;
-}
-.enterAvatar {
-  width: 60px;
-  height: 60px;
-  // border-radius: 50%;
-  margin: auto;
-}
-.line {
-  border-top: 1px solid #ccc;
-}
-.list-shape {
-  background-color: #fff;
-  border-radius: 12px 12px 0 0;
-  .titleBox {
-    display: flex;
-    align-items: center;
-    justify-content: space-between;
-  }
-}
-.salary-text {
-	float: right;
-  font-size: 15px;
-	color: #00B760;
-  font-weight: 700;
-}
-.job-name {
-  font-size: 30rpx;
-  font-weight: 700;
-  color: #0E100F;
-  overflow: hidden;
-  white-space: nowrap;
-  text-overflow: ellipsis;
-}
-</style>

+ 0 - 165
pagesB/sharePoster/index.vue

@@ -1,165 +0,0 @@
-<template>
-  <view style="position: relative;">
-    <view v-if="shareUrl" class="d-flex align-center flex-column justify-center" style="height: 100vh;">
-      <image v-if="!!shareUrl" :style="imgStyle" @click="handlePreviewSharePoster" :src="shareUrl" :show-menu-by-longpress="true"></image>
-      <view class="color-999 ss-m-t-20 font-size-14 ss-m-b-50">点击图片预览,长按图片保存</view>
-    </view>
-		<canvas canvas-id="posterCanvas" class="shareCanvas" style="width: 330px; height: 600px;"></canvas>
-  </view>
-</template>
-
-<script setup>
-import { ref, computed } from 'vue'
-import { userStore } from '@/store/user'
-import { onLoad } from '@dcloudio/uni-app'
-import { getUserAvatar } from '@/utils/avatar'
-import { getJobAdvertisedShareQrcode } from '@/api/user'
-
-const useUserStore = userStore()
-const baseInfo = computed(() => useUserStore?.baseInfo)
-const shareUrl = ref('')
-const windowWidth = ref(0)
-
-onLoad(() => {
-  const windowInfo = wx.getWindowInfo()
-  windowWidth.value = windowInfo.windowWidth
-  console.log(windowWidth.value, '当前机型屏幕宽')
-})
-
-const imgStyle = computed(() => {
-  if (windowWidth.value <= 320) return `width: 259px; height: 460px;`
-  if (windowWidth.value > 320 && windowWidth.value <= 375) return `width: 313px; height: 560px;`
-  if (windowWidth.value > 375) return `width: 328px; height: 600px;`
-})
-
-// 图片预览
-const handlePreviewSharePoster = () => {
-	uni.previewImage({
-		current: 0,
-		longPressActions: {
-			itemList: ['发送给朋友', '保存图片', '收藏']
-		},
-		urls: [shareUrl.value]
-	})
-}
-
-const getImageTempRatio = (url) => {
-  return new Promise((req, rej)=>{
-    wx.getImageInfo({
-      src:url,
-      success:(res) =>{
-        req(res)
-      }
-    })
-  })
-}
-
-// 个人头像
-const drawAvatar = (ctx, imagePath, x, y, radius, w, h) => {
-  ctx.save() // 保存当前绘图上下文
-  // 绘制圆形裁剪路径
-  ctx.beginPath();
-  ctx.arc(x + radius, y + radius, radius, 0, 2 * Math.PI)
-  ctx.clip();
-  const rate = w / h
-  // 绘制图片
-  if (rate > 1) {
-    const _len = 2 * radius / rate // lenH
-    const _yStart = radius - _len / 2 + y
-    ctx.drawImage(imagePath, x, _yStart, 2 * radius, _len) // 注意这里的宽高是直径的2倍
-  } else {
-    const _len = 2 * radius * rate // lenW
-    const _xStart = radius - _len / 2 + x
-    ctx.drawImage(imagePath, _xStart, y, _len, 2 * radius) // 注意这里的宽高是直径的2倍
-  }
-  ctx.restore() // 恢复之前保存的绘图上下文
-}
-
-const getToLocal = (base64data) => {
-  const fsm = wx.getFileSystemManager()
-  const FILE_BASE_NAME = 'tmp_base64src'; //自定义文件名
-  const [, format, bodyData] = /data:image\/(\w+);base64,(.*)/.exec(base64data) || []
-  if (!format) {
-    return (new Error('ERROR_BASE64SRC_PARSE'))
-  }
-  const filePath = `${wx.env.USER_DATA_PATH}/${FILE_BASE_NAME}.${format}`
-  const buffer = wx.base64ToArrayBuffer(bodyData);
-  fsm.writeFile({
-    filePath,
-    data: buffer,
-    encoding: 'binary',
-    success(r) {
-      console.log(filePath,'filePath')
-      qrCode.value = filePath
-    },
-    fail() {
-      return (new Error('ERROR_BASE64SRC_WRITE'))
-    }
-  })
-}
-
-// 生成分享二维码
-const qrCode = ref()
-const handleShareCode = async () => {
-	const userId = useUserStore?.accountInfo?.userId || ''
-	const query = {
-		scene: 'shareId=' + userId,
-		path: 'pages/login/index',
-		width: 200,
-		autoColor: false,
-		checkPath: true,
-		hyaline: true
-	}
-	const res = await getJobAdvertisedShareQrcode(query)
-	const data = res?.data ? 'data:image/png;base64,' + res.data : ''
-  getToLocal(data)
-}
-
-
-const createPoster = async () => {
-  uni.showLoading({ title: '生成中...', mask: true })
-  await handleShareCode() // 生产分享二维码
-  var context = uni.createCanvasContext('posterCanvas')
-
-  //清空画布
-  context.clearRect(0, 0, 330, 600)
-
-  //背景图片 
-  const { path: bgUrl } = await getImageTempRatio('https://minio.menduner.com/dev/63a182780d26bd552819431b0ca94be8e3c90a90e2f933c61e4c83b4614f2fc6.jpg')
-  context.drawImage(bgUrl, 0, 0, 330, 600) // 路径、x、y、宽、高
-  
-  // 头像
-  const avatarUrl = getUserAvatar(baseInfo.value?.avatar, baseInfo.value?.sex)
-  const { path, width, height } = await getImageTempRatio(avatarUrl)
-  drawAvatar(context, path, 124, 22, 40.5, width, height) // canvas、图片路径、x、y、半径
-
-  //分享二维码
-  // const { path: qrCode } = await getImageTempRatio('https://minio.citupro.com/dev/menduner/miniProgram.jpg')
-  context.drawImage(qrCode.value, 105.5, 312.5, 120, 120)
-
-  context.draw(false, () =>{
-    wx.canvasToTempFilePath({ 
-      canvasId: 'posterCanvas',
-      success:(res)=>{
-        shareUrl.value = res.tempFilePath
-        console.log('canvas-success', shareUrl.value)
-		    uni.hideLoading({})
-      },
-      fail:(err)=>{
-        uni.hideLoading({})
-        console.log('canvas-fail', err)
-      }
-    })
-  })
-}
-createPoster()
-</script>
-
-<style scoped lang="scss">
-.shareCanvas {
-	position: fixed;
-	top: -99999upx;
-	left: -99999upx;
-	z-index: -99999;
-}
-</style>

BIN
static/img/group.png


BIN
static/img/headhunting.png


BIN
static/img/information.png


BIN
static/img/share-cover-border.jpg


BIN
static/img/welfare.png


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
static/svg/student.svg


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
static/svg/workMan.svg


+ 1 - 1
utils/position.js

@@ -126,7 +126,7 @@ const getSystemWebContent = async () => {
   // 优选集团
   // 优选集团
   preferred.value = data.appPreferredGroup
   preferred.value = data.appPreferredGroup
 }
 }
-getSystemWebContent()
+// getSystemWebContent()
 
 
 export const jumpToEnterpriseDetail = async (id) => {
 export const jumpToEnterpriseDetail = async (id) => {
   if (!preferred.value || !Object.keys(preferred.value).length) await getSystemWebContent()
   if (!preferred.value || !Object.keys(preferred.value).length) await getSystemWebContent()

Неке датотеке нису приказане због велике количине промена