Procházet zdrojové kódy

多余文件删除

Xiao_123 před 1 měsícem
rodič
revize
5c737ec1d3

+ 2 - 20
pages.json

@@ -65,12 +65,6 @@
 		{
 			"root": "pagesA",
 			"pages": [
-				{
-					"path": "student/index",
-					"style": {
-						"navigationBarTitleText": "学生专区"
-					}
-				},
 				{
 					"path": "interview/index",
 					"style": {
@@ -84,21 +78,9 @@
 					}
 				},
 				{
-					"path": "balance/index",
-					"style": {
-						"navigationBarTitleText": "我的余额"
-					}
-				},
-				{
-					"path": "vip/index",
-					"style": {
-						"navigationBarTitleText": "vip权益"
-					}
-				},
-				{
-					"path": "vipPackage/index",
+					"path": "resume/index",
 					"style": {
-						"navigationBarTitleText": "会员套餐"
+						"navigationBarTitleText": "简历管理"
 					}
 				}
 			]

+ 2 - 7
pages/index/my.vue

@@ -79,13 +79,8 @@ const vip = computed(() => new Date().getTime() < useUserStore?.userInfo?.vipExp
 const popup = ref()
 
 const defaultList = [
-	// {	title: '在线简历',	path: '/pagesA/resumeOnline/index'	},					
-	// {	title: '附件简历',	path: '/pagesA/resume/index'	},					
-	// { title: '学生专区', path: '/pagesA/student/index', key: 'student', defaultHide: true },
-	// { title: '面试管理', path: '/pagesA/interview/index' },
-	// {	title: '会员套餐', path: '/pagesA/vipPackage/index'	},		
-	// { title: '门墩儿商城', showDialog: true }, // wx6decdf12f9e7a061
-	{ title: '会员套餐', path: '' },
+	{ title: '简历', path: '/pagesA/resume/index' },
+	{ title: '面试', path: '/pagesA/interview/index' },
 	{ title: '联系我们', path: '/pagesB/contactUs/index' },
 	{ title: '协议中心', path: '/pagesB/agreement/index', open: true },
 	{ title: '我要求职', appId: 'wx5dd538ccc752b03a' },

+ 0 - 146
pagesA/balance/index.vue

@@ -1,146 +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.balance > 0 ? (balance?.balance / 100.0).toFixed(2) : 0 }}</text>
-            </view>
-            <view>
-              <button class="btn">充值</button>
-            </view>
-          </view>
-          <view class="list">
-            <uni-list border-full>
-              <uni-list-item
-                v-for="(item, index) in items"
-                :key="index"
-                :title="item.title"
-                :note="item.price"
-                :rightText="item.createTime"
-              />
-            </uni-list>
-            <uni-load-more :status="more" />
-          </view>
-        </view>
-      </scroll-view>
-    </view>
-  </layout-page>
-</template>
-<!-- balance 余额 -->
-<script setup>
-import { ref } from 'vue'
-import {
-  getAccountBalance,
-  getUserWalletTransactionPage
-} 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')
-
-getBalance()
-getList()
-// 获取积分余额
-async function getBalance() {
-  const { data } = await getAccountBalance()
-  if (!data) {
-    return
-  }
-  balance.value = data
-}
-
-async function getList () {
-  try {
-    const { data } = await getUserWalletTransactionPage(pageInfo.value)
-    if (!data || !data.list || !data.list.length) {
-      if (pageInfo.value.pageNo === 1) {
-        return
-      }
-      pageInfo.value.pageNo--
-      more.value = 'more'
-      return
-    }
-    const _data = data.list.map(e => {
-      return {
-        // ...e,
-        // _payPrice: (e.payPrice / 100.0).toFixed(2),
-        // _payTime: timesTampChange(e.payTime)
-        // ...e,
-        title: e.title,
-        createTime: timesTampChange(e.createTime),
-        price: (e.price / 100.0).toFixed(2)
-      }
-    })
-    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()
-}
-</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;
-  }
-}
-</style>

+ 0 - 190
pagesA/info/index.vue

@@ -1,190 +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">
-        <view style="display: flex;flex-wrap: wrap;">
-          <view class="upload-img" v-if="formData?.avatar" @click="handlePreviewImage">
-            <uni-icons size="30" type="clear" color="#fe574a" style="position: absolute;right: -11px; top: -11px; z-index: 9" @click="formData.avatar = ''"></uni-icons>
-            <image :src="formData?.avatar" mode="contain" style="width: 200rpx;height: 200rpx;"></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">
-        <uni-easyinput v-model="formData.phone" placeholder="请输入电话号码" />
-			</uni-forms-item>
-      <uni-forms-item label="常用邮箱" name="email" 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="false" 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="false" 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="false" 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: '',
-    phone: '',
-    email: '',
-    eduType: '',
-    firstWorkTime: '',
-    expType: '',
-    jobType: '',
-    jobStatus: '',
-    maritalStatus: '',
-    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 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 = {
-	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()
-}
-</script>
-
-<style lang="less" scoped>
-
-.wrapper{
-	padding: 15px;
-}
-.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>

+ 15 - 120
pagesA/resume/index.vue

@@ -1,7 +1,15 @@
 <template>
-  <view class="ss-p-b-100" style="height: 100vh; background-color: #f2f4f7;">
-    <uni-notice-bar text="温馨提示:最多可以上传5份附件简历。请在手机上打开此小程序进行文件上传,暂不支持在桌面版小程序中上传文件。" />
-    <view v-if="bioList?.length > 0">
+  <view class="ss-p-b-100">
+    <uni-segmented-control 
+			:current="current"
+			:values="tabList"
+			@clickItem="changeControl"
+			styleType="text"
+			activeColor="#00B760"
+		></uni-segmented-control>
+
+    <view class="ss-m-t-30" style="background-color: #f2f4f7; height: 100vh;"></view>
+    <!-- <view v-if="bioList?.length > 0">
       <uni-card v-for="(item, index) in bioList" :key="index" :is-shadow="true" :border='false' shadow="0px 0px 3px 1px rgba(0,0,0,0.1)">
         <view class="d-flex align-center">
           <view v-if="props.resumeAnalysis" class="ss-m-r-15">
@@ -19,132 +27,19 @@
 		</view>
 		<view v-else class="nodata-img-parent">
 			<image src="https://minio.citupro.com/dev/static/nodata.png" mode="widthFix" style="width: 100vw;height: 100vh;"></image>
-		</view>
-    <view class="bottom-sticky flex-column">
-      <button v-if="props.resumeAnalysis" class="recomm-button" style="margin-bottom: 0;" :loading="analysisLoading" @click="handleResumeAnalysis">开始解析</button>
-      <button class="recomm-button" style="margin-bottom: 0;" @click="handleUpload">微信聊天文件上传</button>
-      <view class="color-primary font-size-14 ss-m-b-25 ss-m-t-10" style="text-align: center;">上传文件大小不能超过20MB</view>
-    </view>
-
-    <uni-popup ref="popup" type="bottom">
-      <button class="big-cancel-button" style="color: #333 !important;" @click="handleDelete">删除附件</button>
-      <button class="big-cancel-button" @click="popup.close(); currentId = ''">取消</button>
-    </uni-popup>
+		</view> -->
   </view>
 </template>
 
 <script setup>
 import { ref } from 'vue'
-import { getPersonResumeCv, saveResume, deleteResume } from '@/api/user'
-import { uploadFile } from '@/api/file'
 import { timesTampChange } from '@/utils/date'
 import { preview } from '@/utils/preview'
 
-const emit = defineEmits(['submit'])
-const props = defineProps({
-  resumeAnalysis: { type: Boolean, default: false }
-})
-
-// 获取附件
-const bioList = ref([])
-const getList = async () => {
-  const { data } = await getPersonResumeCv()
-  bioList.value = data
-}
-getList()
-
-// 更多
-const currentId = ref('')
-const popup = ref()
-const handleOpenPopup = (item) => {
-  currentId.value = item.id
-  popup.value.open()
-}
-
-// 删除附件
-const handleDelete = async () => {
-  if (!currentId.value) return
-  await deleteResume(currentId.value)
-  uni.showToast({
-    title: '删除成功',
-    icon: 'success',
-    duration: 2000
-  })
-  currentId.value = ''
-  popup.value.close()
-  getList()
-}
-
-// 上传附件
-const handleUpload = () => {
-  if (bioList.value.length >= 5) {
-    uni.showToast({
-      icon: 'none',
-      title: '最多可上传5份简历'
-    })
-    return
-  }
-  wx.chooseMessageFile({
-    count: 1,
-    type: 'file',
-    success (res) {
-      // 限制文件上传大小
-      const size = res.tempFiles[0].size
-      if (size / (1024*1024) > 20) {
-        uni.showToast({ icon: 'none', title: '文件大小不能超过20M' })
-        return
-      }
-
-      const title = res.tempFiles[0].name
-      const path = res.tempFiles[0].path
-      //效验是否为支持的文件格式
-      if(/\.(pdf|docx|doc)$/.test(title)){
-        uploadFile(path, 'attachment').then(async (res) => {
-          if (!res.data) {
-            uni.showToast({
-              title: '上传失败',
-              icon: 'none'
-            })
-            return
-          }
-          await saveResume({ title, url: res.data })
-          uni.showToast({
-            title: '上传成功',
-            icon: 'success'
-          })
-          getList()
-        })
-      }else{
-        uni.showToast({
-          icon: 'none',
-          title: '请上传pdf、doc、docx类型的文件',
-          duration: 2000
-        })
-        return
-      }
-    }
-  })
-}
-
-const fileUrl = ref('')
-const checkedIndex = ref()
-const radioChange = (index) => {
-  if (!props.resumeAnalysis) return
-  checkedIndex.value = index
-  if (bioList.value[index]?.url) fileUrl.value = encodeURIComponent(bioList.value[index].url)
-}
-
-const analysisLoading = ref(false)
-const handleResumeAnalysis = () => {
-  if (!fileUrl.value) return uni.showToast({ icon: 'none', title: '请选择要解析的简历' })
-  analysisLoading.value = true
-  emit('submit', fileUrl.value)
-	// uni.navigateTo({
-	// 	url: `/pagesA/resumeAnalysis/index?fileUrl=${fileUrl.value}`
-	// })
-}
-
+const current = ref(0)
+const tabList = ref(['投递简历', '已邀约', '已入职', '已结算', '不合适'])
 
+const changeControl = (e) => {}
 </script>
 
 <style scoped lang="scss">

+ 0 - 174
pagesA/student/addReport.vue

@@ -1,174 +0,0 @@
-<template>
-  <scroll-view class="scrollBox" scroll-y="true">
-    <view class="content">
-      <uni-forms
-        ref="infoRef"
-        v-model="formData"
-        :rules="formRules"
-        validateTrigger="bind"
-        label-width="86px"
-        labelAlign="right"
-      >
-        <uni-forms-item name="enterpriseId" label="实习企业" required>
-          <uni-data-picker v-model="formData.enterpriseId" :localdata="companyList" :clear-icon="false" popup-title="请选择实习企业" :clear="false" :map="{ text: 'enterpriseName', value: 'id' }"></uni-data-picker>
-        </uni-forms-item>
-        <uni-forms-item label="实习报告" name="report" class="f-straight">
-          <view style="display: flex;flex-wrap: wrap;">
-            <view v-for="(img, index) of reportList" :key="index">
-              <view class="upload-img" v-if="img">
-                <uni-icons size="35" type="clear" color="#fe574a" style="position: absolute;right: -15px; top: -15px; z-index: 9" @click="delReport(index)"></uni-icons>
-                <image :src="img" mode="contain" style="width: 200rpx;height: 200rpx;" @click="handlePreviewImage(index)"></image>
-              </view>
-            </view>
-            <view v-if="reportList?.length < 9" class="upload-file" @click="uploadPhotos">
-              <uni-icons type="plusempty" size="50" color="#f1f1f1"></uni-icons>
-            </view>
-          </view>
-        </uni-forms-item>
-        <view class="uploadTip text-center">*请上传实习报告图片(最多可上传9张图片)</view>
-        <view class="uploadTip text-center">*只支持JPG、JPEG、PNG类型的图片</view>
-      </uni-forms>
-    </view>
-    <view class="bottom-sticky">
-      <button type="primary" size="default" class="recomm-button" @click="submit">确认</button>
-    </view>
-  </scroll-view>
-</template>
-
-<script setup>
-import { ref, unref } from 'vue'
-import { onLoad } from '@dcloudio/uni-app'
-import { uploadFile } from '@/api/file'
-import { saveStudentReport } from '@/api/student.js'
-
-const companyList = ref([])
-onLoad((options) => {
-  if (options.companyList) {
-    companyList.value = JSON.parse(options.companyList)
-  }
-})
-
-const formData = ref({
-  enterpriseId: null,
-})
-const formRules = {
-  enterpriseId: {
-		rules: [{required: true, errorMessage: '请选择实习企业' }]
-	},
-}
-
-const infoRef = ref()
-const submit = async () => {
-  const validate = await unref(infoRef).validate()
-  if (!validate) return uni.showToast({ title: '请选择企业', icon: 'none' })
-  if (!reportList.value?.length) return uni.showToast({ title: '请上传实习报告', icon: 'none' })
-  try {
-    await saveStudentReport({
-      ...formData.value,
-      urlList: reportList.value
-    })
-    uni.showToast({ title: '保存成功', icon: 'none' })
-    setTimeout(() => {
-      uni.navigateBack({
-        delta: 1
-      })
-    }, 500)
-  } catch (err) {
-    uni.showToast({ title: err?.msg || '保存失败', icon: 'none' })
-  }
-}
-
-const reportList = ref([])
-const delReport = (index) => {
-  reportList.value.splice(index, 1)
-}
-
-// 图片预览
-const handlePreviewImage = (index) => {
-  uni.previewImage({
-    current: 0,
-    urls: [reportList.value[index]]
-  })
-}
-// 上传
-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
-        reportList.value.push(res.data)
-      }).catch(error => {
-        uni.showToast({
-          icon: 'error',
-          title: '图片上传失败!',
-          duration: 2000
-        })
-      })
-    }
-  })
-}
-
-</script>
-
-<style lang="scss" scoped>
-.img{
-  width: 28%;
-  height: 200rpx;
-  margin: 10rpx;
-  border: 1px solid #f4f4f4;
-}
-.wrapper{
-  height: 84vh;
-  overflow: auto;
-}
-:deep(.uni-section .uni-section-header__decoration) {
-  background-color: #00B760 !important;
-}
-.line {
-  border-top: 1px solid #ccc;
-}
-.picker {
-  flex: 1;
-  overflow: hidden;
-  margin-right: 12px;
-}
-.content {
-  padding: 20rpx;
-  padding-bottom: 50rpx;
-  .uploadTip {
-    color: #00B760;
-    margin-bottom: 20px;
-    font-size: 13px;
-  }
-}
-.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 - 116
pagesA/student/certificateDetail-copy.vue

@@ -1,116 +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: ${canvasWidth}px; height: ${canvasHeight}px;`"></canvas>
-  </view>
-</template>
-
-<script setup>
-import { ref, computed } from 'vue'
-import { onLoad } from '@dcloudio/uni-app'
-import { timesTampChange } from '@/utils/date'
-import { formatName } from '@/utils/getText'
-
-const canvasWidth = 500
-const canvasHeight = 700
-
-const shareUrl = ref('')
-const windowWidth = ref(0)
-
-const itemData = ref(null)
-onLoad(async (options) => {
-  if (options.itemData) {
-    itemData.value = JSON.parse(options.itemData)
-    createPoster()
-  }
-  const windowInfo = wx.getWindowInfo()
-  windowWidth.value = windowInfo.windowWidth
-})
-
-const imgStyle = computed(() => {
-  if (windowWidth.value <= 320) return `width: 259px; height: ${Math.round((canvasHeight*259)/canvasWidth)}px;`
-  if (windowWidth.value > 320 && windowWidth.value <= 375) return `width: 313px; height: ${Math.round((canvasHeight*313)/canvasWidth)}px;`
-  if (windowWidth.value > 375) return `width: 328px; height: ${Math.round((canvasHeight*328)/canvasWidth)}px;`
-})
-
-// 图片预览
-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 createPoster = async () => {
-  uni.showLoading({ title: '生成中...', mask: true })
-  var ctx = uni.createCanvasContext('posterCanvas')
-  //清空画布
-  ctx.clearRect(0, 0, canvasWidth, canvasHeight)
-
-  //背景图片
-  const { path: bgUrl } = await getImageTempRatio('https://minio.citupro.com/dev/static/bgc.jpg')
-  ctx.drawImage(bgUrl, 0, 0, canvasWidth, canvasHeight) // 路径、x、y、宽、高
-  
-  const info = { ...itemData.value }
-  // 绘制文字内容
-  ctx.setFontSize(16)
-  if (info?.student?.schoolName) ctx.fillText(info.student.schoolName, 50, 130)
-  if (info?.student?.majorName) ctx.fillText(info.student.majorName, 50, 160)
-  if (info?.person?.name) ctx.fillText(info.person.name, 50, 190)
-  if (info?.startTime) ctx.fillText(timesTampChange(info.startTime, 'Y-M-D'), 50, 250)
-  if (info?.endTime) ctx.fillText(timesTampChange(info?.endTime, 'Y-M-D'), 50, 310)
-  if (info?.enterprise?.anotherName || info?.enterprise?.name) ctx.fillText(formatName(info.enterprise?.anotherName || info.enterprise.name), 50, 400)
-  if (info?.evaluate) ctx.fillText(info.evaluate, 20, 460)
-  if (info?.createTime) ctx.fillText(timesTampChange(info?.createTime, 'Y-M-D'), 200, 520)
-
-  ctx.font = 'bold';
-  ctx.fillText('兹有', 20, 100)
-  ctx.fillText('同学于', 20, 220)
-  ctx.fillText('至', 20, 280)
-  ctx.fillText('在', 20, 340)
-  ctx.fillText('实习。', 20, 430)
-  ctx.fillText('特此证明。', 20, 490)
-
-  ctx.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)
-      }
-    })
-  })
-}
-</script>
-
-<style scoped lang="scss">
-.shareCanvas {
-	position: fixed;
-	top: -99999upx;
-	left: -99999upx;
-	z-index: -99999;
-}
-</style>

+ 0 - 174
pagesA/student/certificateDetail.vue

@@ -1,174 +0,0 @@
-<template>
-	<view v-if="itemData" style="width: 100vw;height: 100vh;overflow: auto;">
-		<view class="cer-img">
-      <image src="https://minio.citupro.com/dev/static/bgc.jpg" mode="scaleToFill" style="width: 100%;height: 100%;"></image>
-      <view class="cer-introduce">
-				兹有
-				<span class="cer-text">{{ itemData?.student?.schoolName }}</span>
-        <span class="cer-text">{{ itemData?.student?.majorName }}</span>
-        专业<span class="cer-text">{{ itemData?.person?.name }}</span>
-        同学于<span class="cer-text">{{ itemData?.startTime ? timesTampChange(itemData?.startTime, 'Y-M-D') : '' }}</span>
-        至<span class="cer-text">{{ itemData?.endTime ? timesTampChange(itemData?.endTime, 'Y-M-D') : '' }}</span>
-        在<span class="cer-text">{{ formatName(itemData?.enterprise?.anotherName || itemData?.enterprise?.name) }}</span>
-        实习。
-			</view>
-			<view class="cer-comment">{{ itemData?.evaluate }}</view>
-			<view class="cer-prove">特此证明。</view>
-			<view class="cer-end">
-        <view>{{ itemData?.createTime ? timesTampChange(itemData?.createTime, 'Y-M-D') : '' }}</view>
-      </view>
-		</view>
-
-		<view class="bottom-sticky">
-      <view style="display: flex;justify-content: space-evenly;align-itens: center;width: 100%;margin: 20rpx 0;">
-        <!-- <view @click="shareClick" style="display: flex;justify-content: center;flex-direction: column;align-items: center;">
-          <uni-icons type="redo-filled" size="24" color="#00B760"/>
-          <span style="color:#00B760;font-weight:bold;">分享</span>
-        </view> -->
-        <button v-if="itemData?.certificate" type="primary" size="default" class="buttons" @click="viewReport(itemData)">查看附件</button>
-        <button v-else type="primary" size="default" class="buttons" style="background-color:grey;">查看附件</button>
-      </view>
-    </view>
-	</view>
-</template>
-
-<script setup>
-import { ref } from 'vue'
-import { preview } from '@/utils/preview'
-import { onLoad } from '@dcloudio/uni-app'
-import { timesTampChange } from '@/utils/date'
-import { formatName } from '@/utils/getText'
-
-const itemData = ref(null)
-onLoad((options) => {
-  if (options.itemData) itemData.value = JSON.parse(options.itemData)
-})
-
-const viewReport = (item) => {
-	if (!item.certificate) {
-		uni.showToast({
-      title: '加载失败,请稍后重试',
-      icon: 'none',
-      duration: 2000
-    })
-		return
-	}
-	preview(item.certificate)
-}
-
-// 分享按钮点击事件
-// const shareClick = () => {
-// }
-
-</script>
-
-<style lang="less" scoped>
-.cer-img{
-  width: 100vw;
-  height: 89.5vh;
-  position: relative;
-  font-weight: 600;
-}
-.cer-introduce{
-  width: 70%;
-  position: absolute;
-  top: 51%;
-  left: 50%;
-  transform: translate(-50%,-50%);
-  text-indent: 2em;
-	font-weight: 500;
-}
-.cer-text{
-  text-decoration: underline;
-  margin: 0 3px;
-	font-weight: 700;
-}
-.cer-comment{
-	width: 70%;
-  position: absolute;
-  top: 68%;
-  left: 50%;
-  transform: translate(-50%,-50%);
-	text-indent: 2em;
-	display: -webkit-box;
-	-webkit-box-orient: vertical;
-	-webkit-line-clamp: 3;
-	overflow: hidden;
-	text-overflow: ellipsis;
-	font-weight: 500;
-}
-.cer-prove{
-  width: 70%;
-  position: absolute;
-  top: 82%;
-  left: 50%;
-  transform: translate(-50%,-50%);
-  text-indent: 2em;
-	font-weight: 500;
-}
-.cer-end{
-  position: absolute;
-  top: 87%;
-  right: 16%;
-	font-weight: 500;
-}
-button::after{
-	border:none;
-}
-.pop-btn-wrapper{
-	position: relative;
-	margin-top: 15vh;
-	.pop-confirm{
-		background-color: #fff;
-		color: #4b9afd;
-		font-size: 21px;
-		width: 45vw;
-		position: absolute;
-		bottom: 0;
-		left: 0;
-	}
-	.pop-cancel{
-		background-color: #fff;
-		font-size: 21px;
-		width: 45vw;
-		position: absolute;
-		bottom: 0;
-		right: 0;
-	}
-}
-.buttons{
-  width: 70vw;
-  height: 44px;
-  border-radius: 25px;
-  background-color: #00B760;
-  margin: 0;
-}
-
-.share-pop {
-  width: 100%;
-  // height:300rpx;
-  display: flex;
-  justify-content: center;
-  .f-straight {
-    margin: 40rpx;
-    background: unset;
-    &::after{
-      border:none !important;
-    }
-  }
-  .share-round {
-    border-radius:50%;
-    height:100rpx;
-    width:100rpx;
-    display: flex;
-    align-items: center;
-    justify-content: center;
-  }
-  .share-round-1 {
-    background-color:#22a039;
-  }
-  .share-round-2 {
-    background-color:#3693cd;
-  }
-}
-</style>

+ 0 - 116
pagesA/student/certificateDetailCanvas.vue

@@ -1,116 +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: ${canvasWidth}px; height: ${canvasHeight}px;`"></canvas>
-  </view>
-</template>
-
-<script setup>
-import { ref, computed } from 'vue'
-import { onLoad } from '@dcloudio/uni-app'
-import { timesTampChange } from '@/utils/date'
-import { formatName } from '@/utils/getText'
-
-const canvasWidth = 500
-const canvasHeight = 700
-
-const shareUrl = ref('')
-const windowWidth = ref(0)
-
-const itemData = ref(null)
-onLoad(async (options) => {
-  if (options.itemData) {
-    itemData.value = JSON.parse(options.itemData)
-    createPoster()
-  }
-  const windowInfo = wx.getWindowInfo()
-  windowWidth.value = windowInfo.windowWidth
-})
-
-const imgStyle = computed(() => {
-  if (windowWidth.value <= 320) return `width: 259px; height: ${Math.round((canvasHeight*259)/canvasWidth)}px;`
-  if (windowWidth.value > 320 && windowWidth.value <= 375) return `width: 313px; height: ${Math.round((canvasHeight*313)/canvasWidth)}px;`
-  if (windowWidth.value > 375) return `width: 328px; height: ${Math.round((canvasHeight*328)/canvasWidth)}px;`
-})
-
-// 图片预览
-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 createPoster = async () => {
-  uni.showLoading({ title: '生成中...', mask: true })
-  var ctx = uni.createCanvasContext('posterCanvas')
-  //清空画布
-  ctx.clearRect(0, 0, canvasWidth, canvasHeight)
-
-  //背景图片
-  const { path: bgUrl } = await getImageTempRatio('https://minio.citupro.com/dev/static/bgc.jpg')
-  ctx.drawImage(bgUrl, 0, 0, canvasWidth, canvasHeight) // 路径、x、y、宽、高
-  
-  const info = { ...itemData.value }
-  // 绘制文字内容
-  ctx.setFontSize(16)
-  if (info?.student?.schoolName) ctx.fillText(info.student.schoolName, 50, 130)
-  if (info?.student?.majorName) ctx.fillText(info.student.majorName, 50, 160)
-  if (info?.person?.name) ctx.fillText(info.person.name, 50, 190)
-  if (info?.startTime) ctx.fillText(timesTampChange(info.startTime, 'Y-M-D'), 50, 250)
-  if (info?.endTime) ctx.fillText(timesTampChange(info?.endTime, 'Y-M-D'), 50, 310)
-  if (info?.enterprise?.anotherName || info?.enterprise?.name) ctx.fillText(formatName(info.enterprise?.anotherName || info.enterprise.name), 50, 400)
-  if (info?.evaluate) ctx.fillText(info.evaluate, 20, 460)
-  if (info?.createTime) ctx.fillText(timesTampChange(info?.createTime, 'Y-M-D'), 200, 520)
-
-  ctx.font = 'bold';
-  ctx.fillText('兹有', 20, 100)
-  ctx.fillText('同学于', 20, 220)
-  ctx.fillText('至', 20, 280)
-  ctx.fillText('在', 20, 340)
-  ctx.fillText('实习。', 20, 430)
-  ctx.fillText('特此证明。', 20, 490)
-
-  ctx.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)
-      }
-    })
-  })
-}
-</script>
-
-<style scoped lang="scss">
-.shareCanvas {
-	position: fixed;
-	top: -99999upx;
-	left: -99999upx;
-	z-index: -99999;
-}
-</style>

+ 0 - 73
pagesA/student/enterpriseRecommendationLetter.vue

@@ -1,73 +0,0 @@
-<template>
-  <view style="height: 98vh; background-color: #f2f4f7; padding-top: 10px;">
-    <view v-if="list.length > 0">
-      <uni-card v-for="(item, index) in list" class="list-item" @tap.stop="viewReport(item)" :key="index" :is-shadow="true" :border='false' shadow="0px 0px 3px 1px rgba(0,0,0,0.1)">
-        <view class="font-weight-bold">From: {{ formatName(item.enterprise.enterpriseName) }}</view>
-				<view>创建时间:{{ timesTampChange(item.entity.createDate) }}</view>
-        <view style="text-align: end;">
-          <text class="color-primary" @tap.stop="viewReport(item)">点击查看</text>
-        </view>
-      </uni-card>
-      <uni-load-more status="noMore" style="line-height: 20vh;" />
-		</view>
-		<view v-else class="nodata-img-parent">
-			<image src="https://minio.citupro.com/dev/static/nodata.png" mode="widthFix" style="width: 100vw;height: 100vh;"></image>
-		</view>
-  </view>
-</template>
-
-<script setup>
-import { ref } from 'vue'
-import { getRecommendationPage } from '@/api/student'
-import { onShow } from '@dcloudio/uni-app'
-import { formatName } from '@/utils/getText'
-import { timesTampChange } from '@/utils/date'
-import { preview } from '@/utils/preview'
-
-const list = ref([
-  {
-    enterprise: {
-      enterpriseName: '门墩儿科技有限公司',
-    },
-    entity: {
-      createDate: 1740570206120,
-      fileUrl: 'https://minio.menduner.com/dev/person/725759784858554368/attachment/7cde29dc69c1403649be55d4c2bfd3d8304c088dc79ab25afe9c4bf55d3b382f.docx'
-    }
-  }
-])
-// list.value = Array.from({ length: 10 }, () => list.value[0]);
-
-// 推荐信预览
-const viewReport = (item) => {
-  if (!item.entity.fileUrl) {
-    uni.showToast({
-      title: '加载失败,请稍后重试',
-      icon: 'none',
-      duration: 2000
-    })
-    return
-  }
-  preview(item.entity.fileUrl)
-}
-
-// 获取推荐信列表
-const getList = async () => {
-  try {
-    const { data } = await getRecommendationPage({ size: 9999, current: 1 })
-    console.log(data, '推荐信列表')
-    // list.value = data.records.reverse()
-  } catch {}
-}
-
-onShow(async () => {
-  await getList()
-})
-</script>
-
-<style lang="scss" scoped>
-.list-item {
-  background-color: #fff;
-  border-radius: 3px;
-  box-shadow: 0px 0px 3px 1px rgba(0,0,0,0.1);
-}
-</style>

+ 0 - 45
pagesA/student/index.vue

@@ -1,45 +0,0 @@
-<template>
-  <view class="card">
-    <uni-list>
-      <uni-list-item
-        v-for="item in list"
-        :clickable="true"
-        :key="item.title"
-        :title="item.title"
-        :showArrow="item.hideArrow ? false : item.rightTex === '未开放' ? false : true"
-        :rightText="item.rightTex || ''"
-        @click="handleToLink(item)"
-      >
-      </uni-list-item>
-    </uni-list>
-  </view>
-</template>
-<script setup>
-import { ref } from 'vue'
-
-const defaultList = [
-	{	title: '学生信息',	path: '/pagesA/student/information'	},
-	{	title: '实习记录',	path: '/pagesA/student/internshipRecord' },
-	{	title: '实习报告',	path: '/pagesA/student/internshipReport' },
-	// {	title: '实习证书',	path: '/pagesA/student/internshipCertificate'	},
-	// {	title: '企业推荐信',	path: '/pagesA/student/enterpriseRecommendationLetter' },
-	{	title: '实习管家',	path: '/pagesA/student/internshipButler' },
-]
-const list = ref(defaultList.filter(e => !e.hide))
-
-const handleToLink = (item) => {
-  if (item.rightTex === '未开放') return
-	if (item.path) return uni.navigateTo({ url: item.path })
-}
-
-</script>
-<style lang="scss" scoped>
-:deep(.uni-list-item) {
-	height: 120rpx !important;
-	line-height: 120rpx !important;
-}
-:deep(.uni-list-item__content-title) {
-	font-size: 32rpx !important;
-	font-weight: 500;
-}
-</style>

+ 0 - 207
pagesA/student/information.vue

@@ -1,207 +0,0 @@
-<!-- 校验是否完善人才必填信息 -->
-<template>
-  <scroll-view class="scrollBox" scroll-y="true">
-    <view class="content">
-      <!-- <view class="text-center ss-m-b-50 font-size-20 color-primary">学生信息认证</view> -->
-      <uni-forms
-        ref="baseInfoRef"
-        v-model="formData"
-        :rules="formRules"
-        validateTrigger="bind"
-        label-width="131px"
-        labelAlign="right"
-      >
-        <uni-forms-item name="schoolId" label="就读学校" required>
-          <uni-data-picker v-model="formData.schoolId" :localdata="selects?.schools" :clear-icon="false" popup-title="请选择就读学校" @change="getSelectData(0)" :map="{ text: 'name', value: 'schoolId' }"></uni-data-picker>
-        </uni-forms-item>
-        <uni-forms-item name="schoolDeptId" label="所在院系" required>
-          <uni-data-picker v-model="formData.schoolDeptId" :localdata="selects?.dept" :clear-icon="false" popup-title="请选择所在院系" @change="getSelectData(2)" :map="{ text: 'name', value: 'id' }"></uni-data-picker>
-        </uni-forms-item>
-        <uni-forms-item name="majorId" label="所学专业" required>
-          <uni-data-picker v-model="formData.majorId" :localdata="selects?.major" :clear-icon="false" popup-title="请选择所学专业" @change="getSelectData(2)" :map="{ text: 'nameCn', value: 'id' }"></uni-data-picker>
-        </uni-forms-item>
-        <uni-forms-item name="schoolClassId" label="所在班级" required>
-          <searchComBox ref="schoolClassIdRef" v-model="formData.schoolClassId" :candidates="classList" itemTextName='schoolClassName' itemValueName='schoolClassId' labelKey='name' valueKey='id' placeholder="请选择所在班级"></searchComBox>
-        </uni-forms-item>
-        <uni-forms-item name="studentNo" label="学号" required>
-          <uni-easyinput placeholder="请填写学号" v-model="formData.studentNo" :inputBorder="false" type="text"></uni-easyinput>
-        </uni-forms-item>
-        <uni-forms-item name="idCardNo" label="身份证号码" required>
-          <uni-easyinput placeholder="请输入身份证号码" v-model="formData.idCardNo" :inputBorder="false" type="text"></uni-easyinput>
-        </uni-forms-item>
-        <uni-forms-item name="emergencyContactName" label="紧急联系人姓名" required>
-          <uni-easyinput placeholder="请填写紧急联系人姓名" v-model="formData.emergencyContactName" :inputBorder="false" type="text"></uni-easyinput>
-        </uni-forms-item>
-        <uni-forms-item name="emergencyContactPhone" label="紧急联系人手机号" required>
-          <uni-easyinput placeholder="请填写紧急联系人手机号" v-model="formData.emergencyContactPhone" :inputBorder="false" type="number"></uni-easyinput>
-        </uni-forms-item>
-      </uni-forms>
-      <view class="f-horizon-center">
-        <button type="primary" size="default" class="send-button" @click="submit">保 存</button>
-      </view>
-    </view>
-  </scroll-view>
-</template>
-
-<script setup>
-import { ref, unref } from 'vue'
-import { mobile, isValidIdCard18 } from '@/utils/validate'
-import { saveStudentSimpleInfo, getStudentInfo } from '@/api/user'
-// import { userStore } from '@/store/user'; const useUserStore = userStore()
-import { getSchoolList, getDepartmentListBySchoolId, getMajorList } from '@/api/student'
-import searchComBox from '@/components/searchCombox'
-
-const baseInfoRef = ref()
-const formData = ref({ // 必填项目
-  schoolId: null,
-  schoolDeptId: null,
-  majorId: null,
-  schoolClassId: null,
-  schoolClassName: null,
-  studentNo: null,
-  idCardNo: null,
-  emergencyContactName: null,
-  emergencyContactPhone: null,
-})
-
-// 获取学生基本信息
-const studentInfoFun = async () => {
-  const { data } = await getStudentInfo()
-  // 回显
-  Object.keys(data).length && Object.keys(formData.value).length && Object.keys(formData.value).forEach(key => formData.value[key] = data[key])
-  // if (!formData.value?.schoolClassId && formData.value?.schoolClassName) formData.value.schoolClassId = formData.value.schoolClassName
-  await getSelectData('default', true)
-  await getSelectData(0, true)
-  await getSelectData(1, true)
-  await getSelectData(2, true)
-}
-studentInfoFun()
-
-// // 下拉列表 
-const selects = ref({})
-const classList = ref([])
-const getSelectData = async (type = 'default', init = false) => { // type: 0院系|1专业|2班级
-  const params = { ...(type !== 'default' && { type }) }
-  // 查院系用 schoolId 查班级用 parentId
-  if (type === 0) {
-    if (!formData.value?.schoolId) return
-    params.schoolId = formData.value.schoolId
-  }
-  if (type === 2) {
-    if (!formData.value?.schoolId && !formData.value?.schoolDeptId) return
-    if (formData.value?.schoolId) params.schoolId = formData.value.schoolId
-    if (formData.value?.schoolDeptId) params.parentId = formData.value.schoolDeptId
-  }
-  const api = {
-    default: getSchoolList,
-    0: getDepartmentListBySchoolId,
-    1: getMajorList,
-    2: getDepartmentListBySchoolId,
-  }
-  const res = await api[type](params)
-  if (type === 'default') {
-    selects.value.schools = res?.data?.length ? res.data : []
-  }
-  if (type === 0) {
-    if (!init) {
-      formData.value.schoolDeptId = null
-      formData.value.schoolClassId = null
-    }
-    selects.value.dept = res?.data?.length ? res.data : []
-  }
-  if (type === 1) {
-    selects.value.major = res?.data?.length ? res.data : []
-  }
-  if (type === 2) {
-    if (!init) formData.value.schoolClassId = null
-    classList.value = res?.data?.length ? res.data : []
-    schoolClassIdRef.value && schoolClassIdRef.value.setLabel()
-  }
-}
-
-const formRules = {
-  idCardNo: isValidIdCard18,
-  phone: mobile,
-  schoolId:{
-		rules: [{required: true, errorMessage: '请选择就读学校' }]
-	},
-  schoolDeptId:{
-		rules: [{required: true, errorMessage: '请选择所在院系' }]
-	},
-  majorId: {
-		rules: [{required: true, errorMessage: '请填写所在专业' }]
-	},
-  schoolClassId: {
-		rules: [{required: true, errorMessage: '请填写所在班级' }]
-	},
-  studentNo: {
-		rules: [{required: true, errorMessage: '请填写学号' }]
-	},
-  emergencyContactName: {
-		rules: [{required: true, errorMessage: '请填写紧急联系人姓名' }]
-	},
-  emergencyContactPhone: mobile,
-}
-
-const schoolClassIdRef = ref()
-const submit = async () => {
-  const validate = await unref(baseInfoRef).validate()
-  if (!validate) return uni.showToast({ title: '请将信息补充完整', icon: 'none' })
-  let params = {...formData.value}
-
-  const schoolClassObj = schoolClassIdRef.value?.getValue()
-  params = { ...params, ...schoolClassObj }
-
-  try {
-    await saveStudentSimpleInfo(params)
-    uni.showToast({
-			icon: 'success',
-			title: '保存成功'
-		})
-		setTimeout(() => {
-      uni.navigateBack({
-        delta: 1
-      })
-    }, 1000)
-  } catch (err) {
-    uni.showToast({ title: err?.msg || '保存失败', icon: 'none' })
-  }
-}
-
-</script>
-
-<style lang="scss" scoped>
-.scrollBox {
-  width: 100vw;
-  // height: 100vh;
-  height: calc(100vh - 30rpx);
-  margin-bottom: 30rpx;
-}
-.content {
-  padding: 30rpx;
-}
-
-.changeRole {
-  color: var(--color-666);
-  font-size: 15px;
-  line-height: 26px;
-  margin-bottom: 40rpx;
-}
-.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 - 31
pagesA/student/internshipButler.vue

@@ -1,31 +0,0 @@
-<template>
-    <view class="parents">
-        <image src="https://minio.citupro.com/dev/static/wx.jpg" mode="aspectFit" show-menu-by-longpress="true" class="img-code"></image>
-		<view class="tipsText">长按添加管家微信</view>
-    </view>
-</template>
-
-<script setup>
-	// 实习管家
-</script>
-
-<style lang="less" scoped>
-.parents{
-    position: relative;
-    background-color: #f8f8f8;
-}
-.img-code{
-    width: 100%;
-    height: 100vh;
-}
-.tipsText{
-    position: absolute;
-    top: 89%;
-    right: 50%;
-    transform: translate(50%, 0);
-    text-align: center;
-    color: #c2c5c7;
-    font-size: 12px;
-    font-weight: 700;
-}
-</style>

+ 0 - 72
pagesA/student/internshipCertificate.vue

@@ -1,72 +0,0 @@
-<template>
-  <view style="height: 98vh; background-color: #f2f4f7; padding-top: 10px;">
-    <view v-if="list.length > 0">
-      <uni-card v-for="(item, index) in list" class="list-item" @tap.stop="handleToDetail(item)" :key="index" :is-shadow="true" :border='false' shadow="0px 0px 3px 1px rgba(0,0,0,0.1)">
-        <view class="font-weight-bold">实习企业: {{ formatName(item.enterprise.enterpriseName) }}</view>
-				<view>创建时间:{{ timesTampChange(item.studentInternshipCertificate.createDate) }}</view>
-        <view>实习点评:{{ item.studentInternshipCertificate.comment }}</view>
-        <view style="text-align: end;">
-          <text class="color-primary" @tap.stop="handleToDetail(item)">点击查看</text>
-        </view>
-      </uni-card>
-		</view>
-		<view v-else class="nodata-img-parent">
-			<image src="https://minio.citupro.com/dev/static/nodata.png" mode="widthFix" style="width: 100vw;height: 100vh;"></image>
-		</view>
-  </view>
-</template>
-
-<script setup>
-import { ref } from 'vue'
-import { getEnterpriseCertificateList } from '@/api/student'
-import { onShow } from '@dcloudio/uni-app'
-import { formatName } from '@/utils/getText'
-import { timesTampChange } from '@/utils/date'
-import { preview } from '@/utils/preview'
-
-const list = ref([
-  {
-    enterprise: {
-      enterpriseName: '门墩儿科技有限公司',
-    },
-    entity: {
-      createDate: 1740570206120,
-      fileUrl: 'https://minio.menduner.com/dev/person/725759784858554368/attachment/7cde29dc69c1403649be55d4c2bfd3d8304c088dc79ab25afe9c4bf55d3b382f.docx'
-    },
-    studentInternshipCertificate: {
-      comment: '这是一条测试数据',
-      createDate: 1740570206120
-    }
-  }
-])
-
-// 查看证书详情
-const handleToDetail = (item) => {
-  console.log(111)
-  uni.navigateTo({
-    url: '/pagesA/student/certificateDetail?id=' + '1111'
-  })
-}
-
-// 获取实习证书列表
-const getList = async () => {
-  try {
-    const { data } = await getEnterpriseCertificateList({ size: 9999, current: 1 })
-    console.log(data, '实习证书')
-    // list.value = data.records.reverse()
-  } catch {}
-}
-
-onShow(async () => {
-  // await getList()
-})
-</script>
-
-<style lang="scss" scoped>
-.list-item {
-  background-color: #fff;
-  border-radius: 3px;
-  padding: 20px;
-  box-shadow: 0px 0px 3px 1px rgba(0,0,0,0.1);
-}
-</style>

+ 0 - 191
pagesA/student/internshipRecord.vue

@@ -1,191 +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>
-    <scroll-view class="scrollBox defaultBgc" scroll-y="true" @scrolltolower="loadingMore" style="height: calc(100vh - 36px);">
-      <view v-if="dataList.length">
-        <uni-card v-for="(val, index) in dataList" :key="index" :is-shadow="true" :border='false' shadow="0px 0px 3px 1px rgba(0,0,0,0.1)">
-          <!-- 企业信息 -->
-          <view class="entInfoBox d-flex align-center ss-p-10 ss-p-l-20 ss-m-b-20">
-            <image class="enterAvatar" :src="val.enterprise.logoUrl ? val.enterprise.logoUrl : 'https://minio.citupro.com/dev/menduner/company-avatar.png'"></image>
-            <view class="ellipsis ss-m-l-20" style="flex: 1;">
-              <view class="enterpriseName font-size-16 ellipsis">{{ 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>
-          </view>
-          <!-- 职位信息 -->
-          <view class="list-shape ss-p-b-10" >
-            <view class="titleBox my-5">
-              <view class="job-name font-size-16" :style="{'max-width': !val.job.payFrom && !val.job.payTo ? '65vw' : '50vw'}">{{ formatName(val.job.name) }}</view>
-              <span v-if="!val.job.payFrom && !val.job.payTo" class="salary-text">面议</span>
-              <span v-else class="salary-text">{{ val.job.payFrom }}-{{ val.job.payTo }}{{ val.job.payName ? '/' + val.job.payName : '' }}</span>
-            </view>
-            <view style="font-size: 13px;" class="ss-m-t-10">
-              <span class="tag-gap" style="color: #808080;">
-                <span>{{ val.job.area?.str ?? '全国' }}</span>
-                <span class="ss-m-x-10" v-if="val.job.eduName">|</span>
-                <span>{{ val.job.eduName }}</span>
-                <span class="ss-m-x-10" v-if="val.job.expName">|</span>
-                <span>{{ val.job.expName }}</span>
-              </span>
-            </view>
-          </view>
-          <view>实习时间:{{ timesTampChange(val?.startTime, 'Y-M-D') }} 至 {{ timesTampChange(val?.endTime, 'Y-M-D') }}</view>
-          <view class="line ss-m-y-20"></view>
-          <view style="text-align: right;">
-            <button @tap="handleToReport(val)" class="ss-m-r-10" type="warning" size="mini" style="color:#fff; backgroundColor:#fb8c00;borderColor:#fb8c00">实习报告</button>
-            <button @tap="handleToCertificate(val)" class="ss-m-x-10" type="warning" size="mini" style="color:#fff; backgroundColor:#00b760;borderColor:#00b760">实习证书</button>
-            <button @tap="preview(val?.recommendationLetter)" class="ss-m-l-10" type="warning" size="mini" style="color:#fff; backgroundColor:#00897b;borderColor:#00897b">企业推荐信</button>
-          </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 { getDict } from '@/hooks/useDictionaries'
-import { getStudentPage } from '@/api/student'
-import { formatName } from '@/utils/getText'
-import { timesTampChange } from '@/utils/date'
-import { dealDictObjData } from '@/utils/position'
-import { preview } from '@/utils/preview'
-
-const more = ref('more')
-const current = ref(0)
-const query = ref({
-  pageNo: 1,
-  pageSize: 10
-})
-
-const dataList = ref([])
-const getData = async () => {
-  try {
-    const params = {
-      status: tabList.value[current.value]?.value,
-      ...query.value
-    }
-    if (!params?.status) return
-    const { data } = await getStudentPage(params)
-    const list = data?.list?.length && data.list || []
-
-    list.forEach(e => {
-      e.enterprise = dealDictObjData({}, e.enterprise)
-      e.job = dealDictObjData({}, e.job)
-    })
-    //
-    dataList.value = dataList.value.concat(list)
-    more.value = dataList.value?.length === data?.total ? 'noMore' : 'more'
-  } catch (error) {
-    query.pageNo--
-    more.value = 'more'
-  }
-}
-
-const handleChange = (e) => {
-  current.value = e.currentIndex
-  query.value.pageNo = 1
-  dataList.value = []
-  getData()
-}
-
-// 加载更多
-const loadingMore = () => {
-  more.value = 'loading'
-  query.value.pageNo++
-  getData()
-}
-
-const tabList = ref([])
-const controlList = ref([])
-const getTabList = async () => {
-  const { data } = await getDict('student_practice_status')
-  if (data.code !== 0) {
-    return
-  }
-  tabList.value = data?.data?.length && data.data || []
-  controlList.value = tabList.value.map(e => e.label) || []
-  if (tabList.value?.length) getData()
-}
-getTabList()
-
-// 实习报告
-const handleToReport = (val) => {
-  uni.navigateTo({ url: `/pagesA/student/internshipReport?enterpriseId=${val?.enterprise?.id}` })
-}
-
-// 查看证书详情
-const handleToCertificate = (val) => {
-  const itemData = JSON.stringify({
-    student: { schoolName: formatName(val?.student?.schoolInfo?.name), majorName: val?.student?.major?.nameCn },
-    person: { name: val?.person?.name },
-    enterprise: { anotherName: formatName(val?.enterprise?.anotherName || val?.enterprise?.name) },
-    startTime: val?.startTime,
-    endTime: val?.endTime,
-    evaluate: val?.evaluate,
-    certificate: val?.certificate,
-    createTime: val?.createTime
-  })
-  uni.navigateTo({ url: `/pagesA/student/certificateDetail?itemData=${itemData}` })
-}
-
-
-</script>
-
-<style scoped lang="scss">
-:deep(.segmented-control) {
-  background-color: #fff !important;
-}
-.enterpriseName {
-  color: #0E100F;
-  // font-weight: 700;
-}
-.enterAvatar {
-  width: 25px;
-  height: 25px;
-  // 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;
-}
-.ellipsis {
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  overflow: hidden;
-}
-.entInfoBox {
-  background: linear-gradient(90deg, #f5fcfc, #fcfbfa);
-}
-</style>

+ 0 - 164
pagesA/student/internshipReport.vue

@@ -1,164 +0,0 @@
-<template>
-  <view style="padding: 20rpx 30rpx;">
-    <view class="d-flex align-center">
-      <uni-section title="企业:"></uni-section>
-      <uni-data-picker v-model="enterpriseId" class="picker" :localdata="companyList" placeholder="请选择要查看的企业" popup-title="选择企业" @change="getList" :map="{ text: 'enterpriseName', value: 'id' }"></uni-data-picker>
-      <button type="primary" size="mini" @click="getList" style="height: 35px; line-height: 35px; margin: 0;">刷新</button>
-    </view>
-    <view class="line ss-m-y-20"></view>
-    <view v-if="items.length > 0" class="wrapper">
-      <view v-for="(item,index) in items" :key="index" style="margin: 0 0 50rpx 0;">
-        <uni-section :title="item.date" type="line"></uni-section>
-        <view>
-          <image v-for="(url, i) in item.arr" :key="i" class="img" :src="url" mode="scaleToFill" @click="previewImage(item.arr,i)"></image>
-        </view>
-      </view>
-    </view>
-    <view v-else class="nodata-img-parent">
-      <image src="https://minio.citupro.com/dev/static/nodata.png" mode="widthFix" class="nodata-img-child"></image>
-    </view>
-    <view class="bottom-sticky">
-      <button type="primary" size="default" class="recomm-button" @click="addReport">新增实习报告</button>
-    </view>
-  </view>
-</template>
-
-<script setup>
-import { ref } from 'vue'
-import { getStudentReportList, getStudentPracticeCompanyList } from '@/api/student.js'
-import { onLoad, onShow } from '@dcloudio/uni-app'
-import { formatName } from '@/utils/getText'
-
-const enterpriseId = ref(null)
-const items = ref([])
-const companyList = ref([])
-
-const getCompanyList = async () => {
-  try {
-    const { data } = await getStudentPracticeCompanyList()
-		data?.length && data.forEach(e => {
-			e.id = e.id.toString()
-			e.enterpriseName = formatName(e.anotherName || e.name)
-		})
-    companyList.value = data || []
-	} catch {}
-}
-
-// 实习报告列表
-const getList = async () => {
-	try {
-		const { data } = await getStudentReportList(enterpriseId.value ? { enterpriseId: enterpriseId.value } : {})
-    items.value = []
-		if (!data || !Object.keys(data).length) return
-		for (let item in data) {
-			items.value.push({ date: item, arr: data[item].map(e => e.url) })
-		}
-	} catch {}
-}
-
-// 预览图片
-const previewImage = (url, i) => {
-  uni.previewImage({
-    current: i,
-    urls: url,
-    longPressActions : {
-    itemList: ['发送给朋友', '保存图片', '收藏']
-    }
-  })
-}
-
-onShow(() => {
-  getCompanyList()
-  getList()
-})
-
-onLoad((options) => {
-  if (options.enterpriseId) {
-    enterpriseId.value = options.enterpriseId
-  }
-})
-
-const addReport = () => {
-  if (!companyList.value?.length) {
-    uni.showToast({
-			title: '没有查到实习企业记录!',
-			icon: 'none'
-		})
-    return
-  }
-  const list = JSON.stringify(companyList.value)
-  uni.navigateTo({ url: `/pagesA/student/addReport?companyList=${list}` })
-}
-</script>
-
-<style lang="scss" scoped>
-.img{
-  width: 28%;
-  height: 200rpx;
-  margin: 10rpx;
-  border: 1px solid #f4f4f4;
-}
-.wrapper{
-  height: 84vh;
-  overflow: auto;
-}
-:deep(.uni-section .uni-section-header__decoration) {
-  background-color: #00B760 !important;
-}
-.line {
-  border-top: 1px solid #ccc;
-}
-.picker {
-  flex: 1;
-  overflow: hidden;
-  margin-right: 12px;
-}
-.reportPopup {
-  width: 96vw;
-  .uploadTip {
-    color: #00B760;
-    margin-bottom: 20px;
-    font-size: 13px;
-  }
-  .dialog-title {
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-    color:#767a82;
-    padding: 20rpx;
-    .title {
-      font-weight: bold;
-      margin-left: 10rpx;
-    }
-  }
-  .dialog-content{
-    padding: 20rpx;
-    padding-bottom: 50rpx;
-  }
-  .dialog-bottom{
-    width: 100%;
-    height: 44px;
-    line-height: 44px;
-    text-align: center;
-    color: #fff !important;
-    background-color: #00B760 !important;
-  }
-}
-.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 - 196
pagesA/vip/blockEnt/index.vue

@@ -1,196 +0,0 @@
-<!-- 屏蔽企业 -->
-<template>
-  <view style="height: 100%; overflow: auto;">
-    <!-- 搜索条 -->
-    <view class="white-bgc stick ss-p-t-10">
-      <view style="position: relative;">
-        <uni-search-bar
-          v-model="name"
-          placeholder="请输入公司关键字"
-          cancelButton="none"
-          :focus="false"
-          bgColor="#fff"
-          @confirm="getEntList($event.value)"
-          @clear="query.content = ''"
-        >
-        </uni-search-bar>
-        <button class="search-btn" @click.stop="getEntList" :loading="loading">搜索</button>
-      </view>
-    </view>
-    <!-- 已屏蔽的企业 -->
-    <view class="tags">
-      <view style="color: #777; width: 100%; margin-bottom: 15px;">已屏蔽的企业:</view>
-      <view
-        v-for="k in dataList" :key="k.id"
-        class="tag"
-        style="color: #00B760; background-color: #e2f0ef;;"
-        @tap="handleDel(k)"
-      >
-        {{ k.name }}
-        <uni-icons type="clear" size="16" color="#00B760"></uni-icons>
-      </view>
-    </view>
-     
-    <uni-popup ref="popup" type="bottom" background-color="#fff">
-      <view style="padding: 30rpx;">
-        <view class="entListBox">
-          <view style="color: #777; margin: 20rpx 0 30rpx 40rpx; ">请选择要屏蔽的企业</view>
-          <view v-if="!entList?.length" style="color: #777; text-align: center; margin-top: 20vh;">未查询到相关内容 . . .</view>
-          <uni-card v-else v-for="item in entList" :key="item.key" @click="joinBlock(item)" :is-shadow="true" :border='false' shadow="0px 0px 3px 1px rgba(0,0,0,0.1)">
-            <view>{{ item.value }}</view>
-          </uni-card>
-        </view>
-      </view>
-    </uni-popup>
-    <!-- 确认框 -->
-    <uni-popup ref="confirm" type="dialog">
-      <uni-popup-dialog
-        type="warn"
-        cancelText="取消"
-        confirmText="确认" 
-        title="系统提示"
-        :content="dialogContent"
-        @confirm="handleConfirm"
-        @close="handleClose"
-      ></uni-popup-dialog>
-    </uni-popup>
-  </view>
-</template>
-
-<script setup>
-import { ref } from 'vue'
-import { 
-  getBlockEnterpriseList,
-  handleBlockEnterprise,
-  handleUnBlockEnterprise,
-} from '@/api/vip'
-import { enterpriseSearchByName } from '@/api/resume.js'
-
-const dataList = ref([])
-const getData = async () => {
-  try {
-    const res = await getBlockEnterpriseList()
-    dataList.value = res?.data?.list || []
-  } catch (error) {
-    uni.showToast({
-      title: '查询数据失败,请重试',
-      icon: 'none'
-    })
-  }
-}
-getData()
-
-let confirm = ref()
-const handleConfirm = async () => {
-  if (isDel) {
-    await handleUnBlockEnterprise(enterpriseId)
-    uni.showToast({ title: '取消屏蔽成功!', icon: 'none' })
-  } else {
-    await handleBlockEnterprise({ enterpriseId })
-    uni.showToast({ title: '屏蔽企业成功!', icon: 'none' })
-  }
-  getData()
-}
-const handleClose = () => {
-  confirm.value.close()
-  dialogContent = ''
-  enterpriseId = ''
-}
-
-let enterpriseId = ''
-let dialogContent = ''
-let isDel = false
-
-// 屏蔽
-const joinBlock = (item) => {
-  isDel = false
-  enterpriseId = item.key
-  dialogContent = `是否屏蔽【${item.value}】?`
-  confirm.value.open()
-
-}
-// 取消屏蔽
-const handleDel = (item) => {
-  isDel = true
-  enterpriseId = item.id
-  dialogContent = `是否取消屏蔽【${item.name}】?`
-  confirm.value.open()
-}
-
-// 搜索企业
-const popup = ref()
-const loading = ref(false)
-const name = ref('')
-const entList = ref([])
-// 获取企业列表
-const getEntList = async () => {
-  if (!name.value || name.value === '公司' || name.value === '有限公司') {
-    uni.showToast({ title: '请输入公司名称关键字查询', icon: 'none' })
-    return
-  }
-  if (name.value.length < 2) {
-    uni.showToast({ title: '输入内容过少,请输入更多关键字查询', icon: 'none' })
-    return
-  }
-  try {
-    loading.value = true
-    const res = await enterpriseSearchByName({ name: name.value })
-    entList.value = res?.data || []
-    popup.value.open()
-    loading.value = false
-  } catch (error) {
-    uni.showToast({
-      title: '搜索失败',
-      icon: 'none'
-    })
-    loading.value = false
-  }
-}
-
-</script>
-<style lang="scss" scoped>
-.stick {
-  z-index: 1;
-  position: sticky;
-  top: 0;
-}
-.search-btn {
-  position: absolute;
-  right: 11px;
-  top: 10px;
-  width: 110px;
-  height: 40px;
-  font-size: 16px;
-  background-color: #00B760;
-  color: #fff;
-  border-radius: 0 5px 5px 0;
-  z-index: 9;
-}
-:deep(.uni-searchbar__box) {
-  width: calc(100% - 105px);
-  height: 40px !important;
-  border: 1px solid #00B760;
-  padding-right: 20px;
-  flex: none;
-}
-
-.tags {
-  display: flex;
-  flex-wrap: wrap;
-  justify-content: center;
-  padding: 30rpx;
-  .tag {
-    margin: 0 15rpx 12rpx 0;
-    border: 2rpx 15rpx #00B760;
-    color: #00B760;
-    white-space: nowrap;
-    padding: 4rpx 10rpx;
-    border-radius: 10rpx;
-    font-size: 24rpx;
-  }
-}
-.entListBox {
-  height: 70vh;
-  overflow: auto;
-}
-</style>

+ 0 - 191
pagesA/vip/index.vue

@@ -1,191 +0,0 @@
-<!-- vip权益 -->
-<template>
-  <view class="box">
-    <!-- vip信息 -->
-    <view class="vipBox">
-      <view class="avatar">
-        <img :src="getUserAvatar(baseInfo?.avatar, baseInfo?.sex)" alt="" class="img-box">
-        <image src="/static/svg/vip.svg" class="vipIcon"></image>
-      </view>
-      <view class="nameBox">
-				<view class="name font-weight-bold font-size-16">{{ baseInfo?.name || userInfo?.phone }}</view>
-				<view class="vipInfo font-size-14">
-          {{ pName }}将于{{ remaining }}后过期
-        </view>
-      </view>
-    </view>
-    <view style="height: 20rpx; background-color: #f8f8fa;"></view>
-    <view class="card">
-      <uni-list>
-        <uni-list-item
-          v-for="item in menuList"
-          :clickable="true"
-          :key="item.title"
-          :title="item.title"
-          :showArrow="!item.hideArrow"
-          :rightText="item.rightTex || ''"
-          @click="handleToLink(item)"
-        >
-        </uni-list-item>
-      </uni-list>
-    </view>
-  </view>
-</template>
-
-<script setup>
-import { userStore } from '@/store/user'
-import { ref, computed, watch } from 'vue'
-import { getUserAvatar } from '@/utils/avatar'
-import { getMembershipPackageList } from '@/api/vip'
-
-const useUserStore = userStore()
-const baseInfo = computed(() => useUserStore?.baseInfo)
-const userInfo = computed(() => useUserStore?.userInfo)
-
-
-let list = [
-	// {	title: '简历刷新次数', key: 'resumeRefreshCount', show: false,	path: '', hideArrow: true },
-	{	title: '简历模板', key: 'resumeTemplate', show: false,	path: '/pagesA/vip/template/index' },
-	{	title: '简历屏蔽', key: 'resumePrivacy', show: false,	path: '/pagesA/vip/blockEnt/index' },
-]
-const listKeys = list.map(e => e.key)
-
-const memberList = ref([])
-
-// 权益列表
-const menuList = ref([])
-watch(() => userInfo.value?.entitlement, 
-  (newVal) => {
-    // if (newVal) getPName()
-    if (newVal && listKeys?.length) {
-      listKeys.forEach(key => {
-        const item = list.find(e => e.key === key)
-        if (!item) return
-        //
-        if (key === 'resumeRefreshCount') { // 简历刷新次数
-          item.rightTex = '剩余 ' + (newVal[key] ? newVal[key] : 0) + ' 次'
-        }
-        item.show = Boolean(newVal[key] || newVal[key] === 0)
-      })
-      menuList.value = list.filter(e => e.show)
-    }
-  },
-  {
-    // deep: true,
-    immediate: true
-  }
-)
-
-const remaining = computed(() => {
-  if (!userInfo.value?.vipExpireDate) return ' 0 天'
-  const diffInMs =  (userInfo.value?.vipExpireDate-0) - new Date().getTime()
-  const day = diffInMs / (1000 * 60 * 60 * 24)
-  return day < 1 ? '今天' : Math.floor(day) + '天'
-})
-
-
-// 列表跳转
-const handleToLink = (item) => {
-  if (item?.path) {
-    uni.navigateTo({
-      url: item.path
-    })
-  }
-}
-const pName = ref('')
-let getPNameNum = 0 
-const getPName = () => {
-  if (!userInfo.value?.vipFlag) {
-    getPNameNum++
-    if (getPNameNum > 6)
-    setTimeout(() => { getPName() }, 1000);
-    return
-  }
-  memberList.value.forEach(e => {
-    if (e.id && e.id.toString() === userInfo.value?.vipFlag?.toString()) pName.value = e.name
-  })
-}
-
-const getMemberList = async () => {
-  try {
-    const { data } = await getMembershipPackageList()
-    if (!data || data.length === 0) {
-      return
-    }
-    memberList.value = data
-    // let vipFlagIndex = null
-    // const list = data.map((item, index) => {
-    //   item.id = item.id?.toString()
-    //   if (item.id === userInfo.value?.vipFlag) vipFlagIndex = index // 低于当前套餐的(套餐)不展示
-    //   if (item.recommend) recommend.value = index // 推荐套餐
-    //   return {
-    //     ...item,
-    //     my: vipFlagIndex === index,
-    //     list: JSON.parse(item.text),
-    //     type: 3, // 订单类型 type:订单类型 0平台订单|1发布职位|2发布众聘职位|3会员套餐|4企业会员套餐|5招聘会门票
-    //     loading: false
-    //   }
-    // })
-    // // 低于当前套餐的(套餐)不展示
-    // memberList.value = vipFlagIndex ? list.slice(vipFlagIndex) : list
-    getPName()
-  } catch (error) {
-    uni.showToast({ title: '查询数据失败,请重试', icon: 'none' })
-  }
-}
- 
-
-
-getMemberList()
-
-</script>
-<style lang="scss" scoped>
-.vipBox {
-	// color: #a18a0f;
-  padding: 80rpx 50rpx;
-  display: flex;
-  background: linear-gradient(121deg,#fde2c2 29.02%,#c19164 104.03%);
-  .avatar{
-    position: relative;
-    width: 100rpx;
-    height: 100rpx;
-    margin: 0;
-    .img-box {
-      width: 100%;
-      height: 100%;
-      border: 2rpx solid #ccc;
-      border-radius: 50%;
-      border: 1px solid gold;
-    }
-    .vipIcon {
-      position: absolute;
-      width: 50%;
-      height: 50%;
-      bottom: 0;
-      right: 0;
-      transform: translate(0, 30%);
-    }
-  }
-  .nameBox {
-    display: flex;
-    flex-direction: column;
-    justify-content: space-around;
-    margin-left: 30rpx;
-    .name {
-      color: #724d2b;
-    }
-    .vipInfo {
-      color: #572a00;
-    }
-  }
-}
-
-:deep(.uni-list-item) {
-	height: 120rpx !important;
-	line-height: 120rpx !important;
-}
-:deep(.uni-list-item__content-title) {
-	font-size: 32rpx !important;
-	font-weight: 500;
-}
-</style>

+ 0 - 41
pagesA/vip/template/index.vue

@@ -1,41 +0,0 @@
-<!-- 简历模板 -->
-<template>
-  <view class="ss-p-b-100" style="height: 100vh; background-color: #f2f4f7;">
-    <view v-if="list.length > 0" class="ss-p-t-6">
-			<uni-card v-for="(item, index) in list" :key="index" :is-shadow="true" :border='false' shadow="0px 0px 3px 1px rgba(0,0,0,0.1)">
-				<view class="d-flex align-center">
-          <view @click="preview(item.url)"  style="flex: 1;">
-            <view class="font-size-14" style="font-weight: bold; margin: 15rpx 0; color: #777;">{{ item.title }}</view>
-          </view>
-          <uni-icons class="ss-m-l-20" color="#00B760" type="eye-filled" size="20"></uni-icons>
-          <uni-icons class="ss-m-l-20" color="#00B760" @click="null" type="download-filled" size="20"></uni-icons>
-        </view>
-			</uni-card>
-		</view>
-    <button class="send-button ss-m-b-30" @click="goto('/')">回到首页</button>
-  </view>
-</template>
-
-<script setup>
-import { preview } from '@/utils/preview'
-
-// 简历模板列表
-const list = [
-  { title: '创新精英简历模板', url: 'https://minio.menduner.com/dev/menduner/resumeTemplate/%E5%88%9B%E6%96%B0%E7%B2%BE%E8%8B%B1%E7%AE%80%E5%8E%86%E6%A8%A1%E6%9D%BF.docx' },
-  { title: '顶尖人才简历模板', url: 'https://minio.menduner.com/dev/menduner/resumeTemplate/%E9%A1%B6%E5%B0%96%E4%BA%BA%E6%89%8D%E7%AE%80%E5%8E%86%E6%A8%A1%E6%9D%BF.docx' },
-  { title: '高级职业经理人简历模板', url: 'https://minio.menduner.com/dev/menduner/resumeTemplate/%E9%AB%98%E7%BA%A7%E8%81%8C%E4%B8%9A%E7%BB%8F%E7%90%86%E4%BA%BA%E7%AE%80%E5%8E%86%E6%A8%A1%E6%9D%BF.docx' },
-  { title: '高效职场精英简历模板', url: 'https://minio.menduner.com/dev/menduner/resumeTemplate/%E9%AB%98%E6%95%88%E8%81%8C%E5%9C%BA%E7%B2%BE%E8%8B%B1%E7%AE%80%E5%8E%86%E6%A8%A1%E6%9D%BF.doc' },
-  { title: '领导力简历模板', url: 'https://minio.menduner.com/dev/menduner/resumeTemplate/%E9%A2%86%E5%AF%BC%E5%8A%9B%E7%AE%80%E5%8E%86%E6%A8%A1%E6%9D%BF.docx' },
-  { title: '行业精英专属简历模板', url: 'https://minio.menduner.com/dev/menduner/resumeTemplate/%E8%A1%8C%E4%B8%9A%E7%B2%BE%E8%8B%B1%E4%B8%93%E5%B1%9E%E7%AE%80%E5%8E%86%E6%A8%A1%E6%9D%BF.docx' },
-  { title: '行业领袖简历模板', url: 'https://minio.menduner.com/dev/menduner/resumeTemplate/%E8%A1%8C%E4%B8%9A%E9%A2%86%E8%A2%96%E7%AE%80%E5%8E%86%E6%A8%A1%E6%9D%BF.docx' },
-  { title: '专业卓越简历模板', url: 'https://minio.menduner.com/dev/menduner/resumeTemplate/%E4%B8%93%E4%B8%9A%E5%8D%93%E8%B6%8A%E7%AE%80%E5%8E%86%E6%A8%A1%E6%9D%BF.doc' },
-  { title: '卓越成就简历模板', url: 'https://minio.menduner.com/dev/menduner/resumeTemplate/%E5%8D%93%E8%B6%8A%E6%88%90%E5%B0%B1%E7%AE%80%E5%8E%86%E6%A8%A1%E6%9D%BF.docx' },
-  { title: '卓越职业轨迹简历模板', url: 'https://minio.menduner.com/dev/menduner/resumeTemplate/%E5%8D%93%E8%B6%8A%E8%81%8C%E4%B8%9A%E8%BD%A8%E8%BF%B9%E7%AE%80%E5%8E%86%E6%A8%A1%E6%9D%BF.docx' },
-]
-const goto = (url) => {
-  uni.switchTab({ url })
-}
-
-</script>
-<style lang="scss" scoped>
-</style>

+ 0 - 698
pagesA/vipPackage/index.vue

@@ -1,698 +0,0 @@
-<template>
-  <view>
-    <view class="vipBox">
-      <view class="avatar">
-        <img :src="getUserAvatar(baseInfo?.avatar, baseInfo?.sex)" alt="" class="img-box" :class="{'img-box-atc': userInfo?.vipExpireDate}">
-        <image v-if="new Date().getTime() < userInfo?.vipExpireDate" src="/static/svg/vip.svg" class="vipIcon"></image>
-      </view>
-      <view class="nameBox">
-        <view class="name font-weight-bold font-size-16">{{ baseInfo?.name || userInfo?.phone }}</view>
-        <view class="vipInfo font-size-14" v-if="new Date().getTime() < userInfo?.vipExpireDate">
-          {{ pName }}
-          <view>将于{{ remaining }}后过期</view>
-        </view>
-      </view>
-    </view>
-    <view>
-      <swiper class="swiper-box" :current="current" indicator-dots indicator-active-color="#f1b17a">
-        <swiper-item v-for="(item, index) in memberListLength" :key="index" class="swiper-items">
-          <view class="swiper-item" v-for="val in item" :key="val.id">
-            <view
-              class="card"
-              :class="{ recommend: val.recommend, vipFlag: val.my, active: val.id === chooseId}"
-              @tap="handleChoose(val)"
-            >
-              <text>{{ val.name }}</text>
-              <view>
-                <uni-icons color="#f30" type="icon-renminbi1688" size="16" custom-prefix="iconfont"></uni-icons>
-                <text>{{ val.price }}</text>
-              </view>
-            </view>
-          </view>
-        </swiper-item>	
-      </swiper>
-      <view v-if="typeof chooseId === 'number'" class="itemBox">
-        套餐权益 ( {{ list.name }} )
-        <uni-section
-          v-for="item in list.list"
-          :key="item.id"
-          class="item"
-          :class="{ active: item.active }"
-          titleColor="#774e20"
-          subTitleColor="#774e20"
-          :title="item.text"
-        >
-          <template v-slot:right>
-            <uni-icons color="#774e20" :type="item.active ? 'checkmarkempty' : 'closeempty'" size="20"/>
-          </template>
-        </uni-section>
-      </view>
-    </view>
-    <view class="pay" v-if="!list.my">
-      <view class="pay-box">
-        <view class="price">
-          <uni-icons color="#e68735" type="icon-renminbi1688" size="16" custom-prefix="iconfont"></uni-icons>
-          {{ amount }}
-        </view>
-        <view class="btn" @tap="handleOpen">
-          立刻升级
-        </view>
-        </view>
-    </view>
-    <uni-popup ref="popup" :is-mask-click="false" borderRadius="10px 10px 0 0" background-color="#eee">
-      <view class="popup-content">
-        <view class="popup-content-close">
-          <view class="icon" @tap="handleClose">
-            <uni-icons
-              type="closeempty"
-              color="#999"
-              size="24"
-            />
-          </view>
-        </view>
-        <view class="popup-content-main">
-          <view class="popup-content-main-count">
-            <view class="title">{{ list.name }} 充值</view>
-            <view class="pay">
-              <uni-icons color="#000" type="icon-renminbi1688" size="16" custom-prefix="iconfont"></uni-icons>
-              <view>{{ amount }}</view>
-            </view>
-          </view>
-          <view class="popup-content-main-type">
-            <view v-if="showPayMethods" class="card">
-              <radio-group @change="radioChange">
-                <label class="card-label" v-for="item in payTypeList" :key="item.value">
-                  <view class="name">
-                    <uni-icons :color="item.color" class="mr-1" :type="item.icon" size="24" custom-prefix="iconfont"></uni-icons>
-                    {{item.name}}
-                  </view>
-                  <view>
-                    <radio :value="item.value" :disabled="item.disabled" :checked="item.value === channelValue" />
-                  </view>
-                </label>
-              </radio-group>
-            </view>
-          </view>
-        </view>
-        <view class="popup-content-btn">
-          <button class="popup-content-btn-s" @tap="handlePay">
-            确认支付 
-            <uni-icons color="#FFF" type="icon-renminbi1688" size="16" custom-prefix="iconfont"></uni-icons>
-            {{ amount }}
-          </button>
-        </view>
-      </view>
-    </uni-popup>
-  </view>
-</template>
-
-<script setup>
-import { onHide, onShow } from '@dcloudio/uni-app';
-import { ref, computed } from 'vue'
-import { getUserAvatar } from '@/utils/avatar'
-import { userStore } from '@/store/user'
-import { getMembershipPackageList } from '@/api/vip'
-import { orderCreated, getOrder, getSocialUser, socialUserBind, payOrderSubmit, getOrderPayStatus, getEnableCodeList } from '@/api/common'
-const useUserStore = userStore()
-
-const baseInfo = computed(() => useUserStore?.baseInfo)
-// const userInfo = computed(() => useUserStore?.userInfo)
-const userInfo = ref(useUserStore?.userInfo || {})
-
-const memberList = ref([])
-const recommend = ref(null)
-const chooseId = ref(null)
-const orderInfo = ref(null)
-
-const popup = ref()
-
-const amount = computed(() => {
-  return parseFloat(+list.value.price).toFixed(2)
-})
-
-const memberListLength = computed(() => {
-  const result = [];  
-  for (let i = 0; i < memberList.value.length; i += 2) {  
-      const pair = memberList.value.slice(i, i + 2)
-      result.push(pair)
-  }
-  return result
-})
-
-const pName = computed(() => {
-  return memberList.value.find(item => +item.id === +userInfo.value?.vipFlag)?.name
-})
-
-const remaining = computed(() => {
-  if (!userInfo.value?.vipExpireDate) return null
-  const diffInMs =  userInfo.value?.vipExpireDate - new Date().getTime()
-  const day = diffInMs / (1000 * 60 * 60 * 24)
-  return day < 1 ? '今天' : Math.floor(day) + '天'
-})
-
-const list = computed(() => {
-  const item = memberList.value.find(item => item.id === chooseId.value)
-  return item ?? {}
-})
-
-const current = ref(0)
-const channelValue = ref('')
-const payType = [
-  {
-    name: '微信支付',
-    value: 'wx_lite',
-    icon: 'icon-weixinzhifu',
-    color: '#1AAD19'
-  },
-  {
-    name: '钱包支付',
-    value: 'wallet',
-    disabled: true,
-    icon: 'icon-qianbao1',
-    // color: '#fd9702'
-    color: '#00B760'
-  }
-]
-
-const radioChange = (e) => {
-  channelValue.value = e?.detail?.value || ''
-}
-
-const chooseItem = ref(null)
-const handleChoose = (val) => {
-  chooseId.value = val.id
-  chooseItem.value = val
-}
-
-const handleOpen = () => {
-  popup.value.open('bottom')
-}
-
-const handleClose = () => {
-  popup.value.close()
-}
-
-// 设置 openid 到本地存储,目前只有 pay 支付时会使用
-const setOpenid = (openid) => {
-  uni.setStorageSync('openid', openid)
-}
-
-const bind = () => {
-  return new Promise(async (resolve, reject) => {
-    // 1. 获得微信 code
-    const codeResult = await uni.login()
-    if (codeResult.errMsg !== 'login:ok') {
-      return resolve(false)
-    }
-    // 2. 绑定账号 // // 社交快捷登录
-    const obj = {
-      type: socialType,
-      code: codeResult.code,
-      state: 'default',
-    }
-    const bindResult = await socialUserBind(obj);
-    if (bindResult.code === 0) {
-      setOpenid(bindResult.data)
-      return resolve(true)
-    } else {
-      return resolve(false)
-    }
-  })
-}
-
-const bindWeiXin = () => {
-  uni.showModal({
-    title: '微信支付',
-    content: '请先绑定微信再使用微信支付',
-    success: function (res) {
-      if (res.confirm) {
-        // 微信小程序绑定
-        bind()
-      }
-    },
-  });
-}
-
-const socialType = 34; // 社交类型 - 微信小程序
-
-// 预支付
-const prepay = async (channel, orderData) => { 
-  return new Promise(async (resolve, reject) => {
-    let data = {
-      id: orderData.payOrder.id,
-      channelCode: channel,
-      channelExtras: {},
-    };
-    // 特殊逻辑:微信公众号、小程序支付时,必须传入 openid
-    if (['wx_pub', 'wx_lite'].includes(channel)) {
-      const userRes = await getSocialUser(socialType)
-      const openid = userRes?.data?.openid ? userRes.data.openid : null
-      // 如果获取不到 openid,微信无法发起支付,此时需要引导
-      if (!openid) {
-        bindWeiXin()
-        return
-      }
-      // console.log('openid:', openid)
-      data.channelExtras.openid = openid
-    }
-    // 发起预支付 API 调用
-    payOrderSubmit(data).then((res) => {
-      // 成功时
-      res.code === 0 && resolve(res)
-      // 失败时
-      if (res.code !== 0 && res.msg.indexOf('无效的openid') >= 0) {
-        // 特殊逻辑:微信公众号、小程序支付时,必须传入 openid 不正确的情况
-        if (
-          res.msg.indexOf('无效的openid') >= 0 || // 获取的 openid 不正确时,或者随便输入了个 openid
-          res.msg.indexOf('下单账号与支付账号不一致') >= 0
-        ) {
-          bindWeiXin()
-        }
-      }
-    })
-  })
-}
-
-let interTimer = null
-let payLoading = false
-const checkPayStatus = async (id) => {
-  if (!id) return
-  try {
-    if (payLoading || !interTimer) return
-    payLoading = true
-    const res = await getOrderPayStatus({ id })
-    if (res?.data?.status === 10) {
-      if (interTimer) clearInterval(interTimer)
-      // emit('paySuccess')
-      setTimeout(async () => {
-        const _userInfo = await useUserStore.getUserInfo()
-        userInfo.value = _userInfo
-        getMemberList() // 刷新套餐列表
-      }, 1500)
-    }
-  } catch (error) {
-    console.log(error)
-  } finally {
-    payLoading = false
-  }
-}
-
-// 计时器
-const initIntervalFun = () => {
-  if (interTimer) clearInterval(interTimer)
-
-  // 查询是否已经支付
-  const id = orderInfo.value?.payOrder?.id || orderInfo.value?.order?.payOrderId
-  if (id) {
-    interTimer = setInterval(() => {
-      checkPayStatus(id)
-    }, 1000)
-  }
-}
-
-const weChatMiniProgramPay = async (orderData) => {
-  orderInfo.value = orderData
-  let res = await prepay(channelValue.value, orderData); // 预支付
-  if (res?.code !== 0) {
-    return;
-  }
-  // 调用微信小程序支付
-  const payConfig = res?.data?.displayContent ? JSON.parse(res.data.displayContent) : null
-  if (!payConfig) return uni.showToast({ title: '购买失败', icon: 'none'})
-  uni.requestPayment({
-    provider: 'wxpay',
-    timeStamp: payConfig.timeStamp,
-    nonceStr: payConfig.nonceStr,
-    package: payConfig.packageValue,
-    signType: 'RSA',
-    paySign: payConfig.paySign,
-    success: (res) => {
-      initIntervalFun()
-      popup.value.close()
-      uni.showToast({ title: '支付成功', icon: 'none'})
-    },
-    fail: (err) => {
-      if (err.errMsg === 'requestPayment:fail cancel') {
-        uni.showToast({ title: '支付已取消', icon: 'none'})
-      } else {
-        // this.payResult('fail');
-        uni.showToast({ title: '支付失败', icon: 'none'})
-      }
-    },
-  });
-}
-
-// 支付
-const handlePay = async () => {
-  if (!channelValue.value) {
-    uni.showToast({ title: '请选择支付方式', icon: 'none'})
-    return
-  }
-  const val = chooseItem.value
-  try {
-    const res = await getOrder({
-      spuId: val.id, // 商品编号
-      type: val.type
-    })
-    if (res.data) {
-      // 获取支付码
-      weChatMiniProgramPay(res.data)
-      return
-    }
-
-    await orderCreated({
-      spuId: val.id, // 商品编号
-      spuName: val.name, // 商品名称
-      price: val.price*100, // 价格
-      type: val.type // 订单类型 type:订单类型 0平台订单|1发布职位|2发布众聘职位|3会员套餐|4企业会员套餐|5招聘会门票
-    })
-
-    const _res = await getOrder({
-      spuId: val.id, // 商品编号
-      type: val.type
-    })
-
-    // 获取支付码
-    weChatMiniProgramPay(_res.data)
-  } catch (error) {
-    console.log(error)
-  } finally {
-    val.loading = false
-  }
-}
-
-const getMemberList = async () => {
-  try {
-    const { data } = await getMembershipPackageList()
-    if (!data || data.length === 0) {
-      return
-    }
-    // memberList.value = data
-    let vipFlagIndex = null
-    const list = data.map((item, index) => {
-      if (new Date().getTime() < userInfo.value?.vipExpireDate && +item.id === +userInfo.value?.vipFlag) {
-        vipFlagIndex = index // 低于当前套餐的(套餐)不展示
-      }
-      if (item.recommend) {
-        recommend.value = index // 推荐套餐
-      }
-      return {
-        ...item,
-        price: item.price/100,
-        my: vipFlagIndex === index,
-        list: JSON.parse(item.text),
-        type: 3, // 订单类型 type:订单类型 0平台订单|1发布职位|2发布众聘职位|3会员套餐|4企业会员套餐|5招聘会门票
-        loading: false
-      }
-    })
-
-    memberList.value = vipFlagIndex ? list.slice(vipFlagIndex) : list // 低于当前套餐的(套餐)不展示
-    // 轮播current位置
-    // if ((!userInfo.value?.vipFlag || userInfo.value?.vipExpireDate - new Date().getTime() > 0 ) && typeof recommend.value === 'number') {
-    //   current.value = parseInt(recommend.value/2)
-    // }
-    handleChoose(memberList.value[0]) // 已购买或者未购买都选中第一个
-  } catch (error) {
-    uni.showToast({ title: '查询数据失败,请重试', icon: 'none' })
-  }
-}
-getMemberList()
-
-onShow(() => {
-  if (orderInfo && orderInfo.value?.id) initIntervalFun()
-})
-onHide(() => {
-  if (interTimer) clearInterval(interTimer)
-})
-
-// 余额和其他还没有接暂时只支持微信支付
-let payTypeList = []
-const showPayMethods = ref(false)
-// 获取支付方式
-const getPayMethodsList = async () => {
-  showPayMethods.value = false
-  payTypeList = []
-  try {
-    const res = await getEnableCodeList({appId: 14})
-    if (!res?.data?.length) {
-      return
-    }
-    payTypeList.push(...payType.filter(e => res.data.includes(e.value)))
-    const result = payType.find(item => !item.disabled && item.value)
-    if (result) channelValue.value = result.value
-    showPayMethods.value = true
-  } catch (error) {
-    console.log(error)
-  }
-}
-getPayMethodsList()
-
-</script>
-
-<style lang="scss" scoped>
-.vipBox {
-	// color: #a18a0f;
-  padding: 80rpx 50rpx;
-  display: flex;
-  background: linear-gradient(121deg,#fde2c2 29.02%,#c19164 104.03%);
-  .avatar{
-    position: relative;
-    width: 100rpx;
-    height: 100rpx;
-    margin: 0;
-    .img-box {
-      width: 100%;
-      height: 100%;
-      border: 2rpx solid #ccc;
-      border-radius: 50%;
-      border: 1px solid gold;
-    }
-    .img-box-atc {
-      border: 1px solid gold;
-    }
-    .vipIcon {
-      position: absolute;
-      width: 50%;
-      height: 50%;
-      bottom: 0;
-      right: 0;
-      transform: translate(0, 30%);
-    }
-  }
-  .nameBox {
-    display: flex;
-    flex-direction: column;
-    justify-content: space-around;
-    margin-left: 30rpx;
-    .name {
-      color: #724d2b;
-    }
-    .vipInfo {
-      color: #572a00;
-    }
-  }
-}
-
-.swiper-box {
-  height: 230rpx;
-  .swiper-items {
-    display: grid;
-    grid-template-columns: 1fr 1fr;
-  }
-  .swiper-item {
-    display: flex;
-    flex-direction: column;
-    justify-content: center;
-    align-items: center;
-    height: 200rpx;
-    padding: 20rpx 10rpx;
-    box-sizing: border-box;
-    .card {
-      color: #774e20;
-      background-color: rgb(255, 251, 248);
-      border: 1px solid #f1b17a;
-      width: 100%;
-      height: 100%;
-      border-radius: 10rpx;
-      padding: 0 20rpx;
-      box-sizing: border-box;
-      display: flex;
-      justify-content: space-between;
-      align-items: center;
-      position: relative;
-      overflow: hidden;
-      &.recommend {
-        &::after {
-          content: '推荐';
-          position: absolute;
-          right: 0;
-          top: 0;
-          padding: 6rpx 10rpx;
-          font-size: 28rpx;
-          background: linear-gradient(121deg,#fde2c2 29.02%,#c19164 104.03%);
-        }
-      }
-      &.vipFlag {
-        &::before {
-          content: '我的套餐';
-          position: absolute;
-          left: 0;
-          top: 0;
-          padding: 6rpx 10rpx;
-          font-size: 28rpx;
-          background: linear-gradient(121deg,#fde2c2 29.02%,#c19164 104.03%);
-        }
-      }
-      &.active {
-        box-shadow: 0 0 18rpx 0 rgb(216 160 82);
-      }
-    }
-  }
-}
-
-.itemBox {
-  padding: 20rpx 40rpx;
-  .item {
-    // padding: 10rpx 0;
-    margin-top: 20rpx;
-    // color: rgba(119,78,32,.5);
-    // &.active {
-      color:#774e20;
-    // }
-  }
-}
-
-.pay {
-  position: sticky;
-  bottom: 0;
-  padding: 0 40rpx 50rpx 40rpx;
-  box-sizing: border-box;
-  &-box {
-    width: 100%;
-    background: linear-gradient(121deg,#fde2c2 29.02%,#c19164 104.03%);
-    border-radius: 180rpx 0 180rpx 0;
-    box-shadow: 3rpx 6rpx 10rpx 0rpx rgb(216 160 82);
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-    height: 100rpx;
-    .price {
-      padding: 0 40rpx;
-      font-size: 40rpx;
-      font-weight: 600;
-      color: #e68735;
-    }
-    .btn {
-      height: 100%;
-      display: flex;
-      align-items: center;
-      padding: 0 40rpx;
-      border: 2rpx solid #00B760;
-      background: #00B760;
-      color: #FFF;
-      border-radius: 180rpx 0 180rpx 0;
-      position: relative;
-      // &::after {
-      //   content: '';
-      //   position: absolute;
-      //   width: 50rpx;
-      //   height: 50rpx;
-      //   background: radial-gradient(top right, transparent 50%, #00B760 50%);
-      //   left: 0;
-      //   top: 0;
-      //   margin-left: -25rpx;
-      //   border-radius: 180rpx;
-      // }
-    }
-  }
-}
-
-.popup-content {
-  max-height: 500px;
-  display: flex;
-  flex-direction: column;
-  &-close {
-    display: flex;
-    padding: 10px;
-    justify-content: flex-end;
-    .icon {
-      width: 30px;
-      height: 30px;
-      background: #ccc;
-      border-radius: 30px;
-      display: flex;
-      align-items: center;
-      justify-content: center;
-    }
-  }
-  &-main {
-    flex: 1;
-    height: 0;
-    overflow-y: auto;
-    &-count {
-      margin-bottom: 20px;
-      text-align: center;
-      .title {
-        font-size: 28rpx;
-        color: #666
-      }
-      .pay {
-        font-size: 52rpx;
-        color: #000;
-        font-weight: 600;
-        display: flex;
-        align-items: center;
-        justify-content: center;
-        padding: 10px 0;
-      }
-    }
-    &-type {
-      width: 100%;
-      padding: 0 20px;
-      box-sizing: border-box;
-      .card {
-        border-radius: 10px;
-        margin: 0 auto;
-        background: #FFF;
-        padding: 10px;
-        &-label {
-          padding: 15px 0;
-          box-sizing: border-box;
-          display: flex;
-          justify-content: space-between;
-          border-bottom: 1px solid #eee;
-          &:last-of-type {
-            border-bottom: none;
-          }
-          .name {
-            display: flex;
-            align-items: center;
-            color: #333;
-          }
-        }
-      }
-    }
-  }
-  &-btn {
-    height: 70px;
-    width: 100%;
-    margin-top: 10px;
-    display: flex;
-    align-items: center;
-    justify-content: center;
-    &-s {
-      height: 40px;
-      width: 75%;
-      line-height: 40px;
-      color: #FFF;
-      // color: #724d2b;
-      background: #00B760;
-      // background: linear-gradient(121deg,#fde2c2 29.02%,#c19164 104.03%);
-      border-radius: 90px;
-    }
-  }
-}
-.mr-1 {
-  margin-right: 10px;
-}
-</style>