Procházet zdrojové kódy

Merge branch 'master' of https://git.nanodreamtech.com/Boss/yizhizan-h5

jianghaili před 3 týdny
rodič
revize
b2c2b1352e

+ 225 - 47
package/jobIntention/jobList.vue

@@ -1,11 +1,22 @@
 <template>
 	<view>
+		<!-- 职业选择头部 -->
+		<view class="profession-header">
+			<view class="header-content">
+				<view class="header-left" @click="goBack">
+					<u-icon name="close" color="#333" size="32"></u-icon>
+				</view>
+				<view class="header-title">职位选择</view>
+				<view class="header-right"></view>
+			</view>
+		</view>
+		
 		<!-- 搜索 -->
-		<view class="search flex justify-center align-center">
+		<!-- <view class="search flex justify-center align-center">
 			<view class="search-box">
 				<u-search placeholder="搜索岗位" :show-action="false" @change="getSearchList" v-model="keyword"></u-search>
 			</view>
-		</view>
+		</view> -->
 		<!-- 搜索列表 -->
 		<view class="searchList flex justify-center" v-if="keyword!=''">
 			<view class="searchList-box">
@@ -34,21 +45,34 @@
 			</view>
 			<!-- 右侧列表 -->
 			<view class="list-r">
-				<scroll-view scroll-y="true" style="width: 100%;height: 100%;padding-bottom: 20rpx;">
-					<view class="list-r-item" v-if="rightList.length>0" v-for="(item,index) in rightList" :key="index">
-						<view class="list-r-item-title">
-							{{item.title}}
-						</view>
-						<view class="list-r-item-childs flex justify-around align-center flex-wrap">
-							<view class="list-r-item-childs-i flex justify-center align-center" @click="selectJob(ite)" v-for="(ite,ind) in item.childrens" :key="ind">
-								{{ite.ruleClassifyName}}
+				<view class="list-r-container">
+					<!-- 中间标题列 -->
+					<view class="list-r-titles">
+						<scroll-view scroll-y="true" style="width: 100%;height: 100%;padding-bottom: 20rpx;">
+							<view class="list-r-title-item" @click="setActiveTitle(index)" :class="activeTitle==index?'active':''" v-for="(item,index) in rightList" :key="index">
+								{{item.title}}
 							</view>
-							<view class="list-r-item-childs-i flex justify-center align-center" style="height: 0;padding: 0;">
+						</scroll-view>
+					</view>
+					<!-- 最右侧子内容列 -->
+					<view class="list-r-content">
+						<scroll-view scroll-y="true" style="width: 100%;height: 100%;padding-bottom: 20rpx;">
+							<view class="list-r-item-childs-vertical" v-if="rightList.length>0 && rightList[activeTitle]">
+								<view class="list-r-item-childs-i" @click="selectJob(ite)" v-for="(ite,ind) in rightList[activeTitle].childrens" :key="ind">
+									{{ite.ruleClassifyName}}
+								</view>
 							</view>
-						</view>
+							<empty v-if="rightList.length==0" />
+						</scroll-view>
 					</view>
-					<empty v-if="rightList.length==0" />
-				</scroll-view>
+				</view>
+			</view>
+		</view>
+
+		<!-- 底部确定按钮 -->
+		<view class="bottom-btn-container">
+			<view class="confirm-btn" @click="confirmSelection">
+				<text>确定</text>
 			</view>
 		</view>
 		
@@ -66,6 +90,7 @@
 				searchList:[],
 				keyword:'',
 				current:0,
+				activeTitle:0,
 				rightList:[],
 				list:[],
 			};
@@ -74,6 +99,12 @@
 			this.getJobList()
 		},
 		methods:{
+			/**
+			 * 返回上一页
+			 */
+			goBack(){
+				uni.navigateBack()
+			},
 			/**
 			 * 搜索岗位
 			 */
@@ -107,7 +138,36 @@
 			setRightList(index){
 				this.current=index
 				this.rightList = this.list[index].childrens
+				this.activeTitle = 0 // 重置为第一个标题
 			},
+			/**
+			 * 设置激活的标题
+			 */
+			setActiveTitle(index){
+				this.activeTitle = index
+			},
+			/**
+			 * 确定选择
+			 */
+			// confirmSelection(){
+			// 	// 获取当前选中的职位信息
+			// 	if(this.rightList.length > 0 && this.rightList[this.activeTitle] && this.rightList[this.activeTitle].childrens.length > 0) {
+			// 		// 这里可以获取选中的职位信息
+			// 		uni.showToast({
+			// 			title: '选择成功',
+			// 			icon: 'success'
+			// 		})
+			// 		// 返回上一页
+			// 		setTimeout(() => {
+			// 			uni.navigateBack()
+			// 		}, 1500)
+			// 	} else {
+			// 		uni.showToast({
+			// 			title: '请先选择职位',
+			// 			icon: 'none'
+			// 		})
+			// 	}
+			// },
 			/**
 			 * 获取岗位列表
 			 */
@@ -118,6 +178,7 @@
 						if(res.data){
 							this.list = res.data
 							this.rightList = this.list[this.current].childrens
+							this.activeTitle = 0 // 初始化时选择第一个标题
 						}
 						
 					}
@@ -129,7 +190,41 @@
 
 <style lang="scss">
 	page {
-		background-color: #ffffff;
+		background-color: #FCFCFC;
+		padding: 0 20rpx;
+	}
+	
+	.profession-header {
+		padding-top: 80rpx;
+		background-color: #FCFCFC;
+		z-index: 9999;
+		box-sizing: border-box;
+		margin-bottom: 40rpx;
+		
+		.header-content {
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			height: 100%;
+			
+			.header-left, .header-right {
+				width: 60rpx;
+				height: 60rpx;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+			}
+			
+			.header-title {
+				color: rgba(51, 51, 51, 1);
+				font-family: DM Sans;
+				font-size: 36rpx;
+				font-weight: 700;
+				line-height: 26px;
+				letter-spacing: 0px;
+				text-align: center;
+			}
+		}
 	}
 	.searchList{
 		width: 100%;
@@ -143,10 +238,8 @@
 		bottom: 0;
 		.searchList-box{
 			width: 686rpx;
-			height: 100%;
 			.searchList-box-scroll{
 				width: 100%;
-				height: 100%;
 				// background-color: red;
 				.searchList-box-item{
 					// margin-bottom: 20rpx;
@@ -170,54 +263,139 @@
 		}
 	}
 	.active{
-		border-left: 8rpx solid #00B88F !important;
-		color: #00B88F !important;
+		border-left: 16rpx solid rgba(1, 107, 246, 1) !important;
+		padding: 10px 0px 10px 0px;
+		color: rgba(1, 107, 246, 1) !important;
+		background: rgba(255, 255, 255, 1);
+		border-radius: 6px;
 	}
 	.list{
 		width: 100;
-		height: calc(100vh - 100rpx);
+		height: calc(100vh - 180rpx);
+		gap: 12rpx;
 		
 		.list-l{
-			width: 30%;
-			height: 100%;
+			width: 25%;
+			height: 90%;
+			border-radius: 6px;
+			background: rgba(245, 245, 245, 1);
+			
 			.list-l-item{
-				margin-top: 40rpx;
-				font-size: 28rpx;
-				color: #121212;
-				padding-left: 20rpx;
-				border-left: 8rpx solid #ffffff;
+				margin-top: 20rpx;
+				color: rgba(102, 102, 102, 1);
+				font-family: DM Sans;
+				padding: 20rpx 10rpx;
+				font-size: 16px;
+				font-weight: 400;
+				line-height: 21px;
+				letter-spacing: 0%;
+				text-align: center;
+				display: flex;
+				align-items: center;
+				justify-content: center;
 			}
 		}
 		.list-r{
-			width: 70%;
-			height: 100%;
+			width: 75%;
+			height: 90%;
+			background-color: #ffffff;
 			border-left: 1rpx solid #F2F2F7;
 			box-sizing: border-box;
-			.list-r-item{
+			
+			.list-r-container{
 				width: 100%;
-				margin-top: 40rpx;
-				.list-r-item-title{
-					width: 100%;
-					color: #121212;
-					font-size: 32rpx;
-					font-weight: bold;
-					padding-left: 30rpx;
+				height: 100%;
+				display: flex;
+				flex-direction: row;
+			}
+			
+			.list-r-titles{
+				width: 50%;
+				height: 100%;
+				border-right: 1rpx solid #F2F2F7;
+				box-sizing: border-box;
+				
+				.list-r-title-item{
+					margin-top: 20rpx;
+					padding: 20rpx 10rpx;
+					color: var(--016BF6, rgba(1, 107, 246, 1));
+					font-family: DM Sans;
+					font-size: 16px;
+					font-weight: 400;
+					line-height: 21px;
+					letter-spacing: 0%;
+					text-align: center;
+					
+					&.active{
+						color: rgba(1, 107, 246, 1) !important;
+						background: rgba(252, 233, 220, 1);
+						padding: 20rpx 10rpx;
+						border-left: none !important;
+						border-radius: 0 !important;
+					}
 				}
-				.list-r-item-childs{
+			}
+			
+			.list-r-content{
+				width: 70%;
+				height: 100%;
+				flex: 1;
+				
+				.list-r-item-childs-vertical{
 					width: 100%;
+					display: flex;
+					flex-direction: column;
+					gap: 12rpx;
+					padding: 20rpx;
+					
 					.list-r-item-childs-i{
-						width: 200rpx;
-						margin-top: 20rpx;
-						padding-top: 16rpx;
-						padding-bottom: 16rpx;
-						padding-left: 16rpx;
-						padding-right: 16rpx;
-						font-size: 26rpx;
-						color: #121212;
-						background-color: #F2F2F7;
+						width: 100%;
+						padding: 15rpx 20rpx;
+						background-color: #F5F5F5;
+						border-radius: 8rpx;
+						margin-bottom: 4rpx;
+						color: rgba(102, 102, 102, 1);
+						font-family: DM Sans;
+						font-size: 14px;
+						font-weight: 400;
+						line-height: 18px;
+						letter-spacing: 0.5%;
+						text-align: center;
+						
+						&:active {
+							background-color: #E5E5E5;
+							transform: scale(0.98);
+						}
 					}
 				}
 			}
 		}
 	}
+	
+	.bottom-btn-container {
+		position: fixed;
+		bottom: 0;
+		left: 0;
+		right: 0;
+		padding: 30rpx 20rpx;
+		background: #fff;
+		border-top: 1px solid #f0f0f0;
+		z-index: 9999;
+	}
+	
+	.confirm-btn {
+		width: 100%;
+		height: 88rpx;
+		background: var(--线性渐变, linear-gradient(90.00deg, rgba(13, 39, 247, 1),rgba(19, 193, 234, 1) 100%));
+		border-radius: 44rpx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		
+		text {
+			font-size: 32rpx;
+			font-weight: 600;
+			color: #fff;
+		}
+	}
 </style>

+ 8 - 0
pages.json

@@ -129,6 +129,14 @@
 				"navigationStyle": "custom"
 			}
 		},
+		{
+			"path": "pages/my/workExperience",
+			"style": {
+				"navigationBarTitleText": "工作经历",
+				"navigationStyle": "custom"
+
+			}
+		},
 		{
 			"path": "pages/my/invitationUser",
 			"style": {

+ 40 - 1
pages/my/onlineResume.vue

@@ -123,7 +123,7 @@
 						<text class="required-title">工作经历</text>
                         <view class="section-desc">请填写专属跨境行业的工作经验</view>
 					</view>
-					<view class="edit-icon">
+					<view class="edit-icon" @click="goToWorkExperience">
 						<image src="../../static/images/index/Combined-Shape.svg" style="width: 48rpx;height: 48rpx;" mode=""></image>
 					</view>
 				</view>
@@ -299,9 +299,48 @@
 				uni.navigateTo({
 					url: '/package/jobIntention/jobSkills'
 				})
+			},
+			goToWorkExperience() {
+				// 获取业务类型数据
+				const businessTypes = this.getBusinessTypes()
+				console.log('传递给工作经历页面的业务类型:', businessTypes)
+				console.log('当前hasEcommerceExperience状态:', this.hasEcommerceExperience)
+				uni.navigateTo({
+					url: `/pages/my/workExperience?businessTypes=${encodeURIComponent(JSON.stringify(businessTypes))}`
+				})
+			},
+			getBusinessTypes() {
+				// 根据是否有跨境电商经验返回业务类型
+				if (this.hasEcommerceExperience) {
+					return ['cross-border-ecommerce']
+				} else {
+					return []
+				}
+			}
+		},
+		watch: {
+			hasEcommerceExperience(newVal, oldVal) {
+				console.log('hasEcommerceExperience 变化:', oldVal, '->', newVal)
+				// 只有有效的布尔值才保存到缓存
+				if (typeof newVal === 'boolean') {
+					uni.setStorageSync('hasEcommerceExperience', newVal)
+				}
 			}
 		},
 		mounted() {
+			console.log('页面加载时 hasEcommerceExperience:', this.hasEcommerceExperience)
+			
+			// 检查是否有缓存的数据
+			const cachedValue = uni.getStorageSync('hasEcommerceExperience')
+			if (cachedValue !== null && cachedValue !== undefined && cachedValue !== '') {
+				console.log('从缓存读取 hasEcommerceExperience:', cachedValue)
+				this.hasEcommerceExperience = cachedValue
+			} else {
+				console.log('缓存中没有有效值,使用默认值:', this.hasEcommerceExperience)
+				// 清除无效的缓存
+				uni.removeStorageSync('hasEcommerceExperience')
+			}
+			
 			// 监听偏好设置更新
 			uni.$on('preferenceUpdated', (data) => {
 				console.log('偏好设置已更新:', data)

+ 620 - 0
pages/my/workExperience.vue

@@ -0,0 +1,620 @@
+<template>
+	<view class="work-experience">
+		<!-- 自定义导航栏 -->
+		<view class="custom-navbar">
+			<view class="navbar-content">
+				<view class="nav-left" @click="goBack">
+					<u-icon name="arrow-leftward" color="#333" size="42"></u-icon>
+				</view>
+				<view class="nav-title">工作经历</view>
+				<view class="nav-right"></view>
+			</view>
+		</view>
+		
+		<!-- 主要内容 -->
+		<view class="main-content">
+			<!-- 公司信息 -->
+			<view class="form-section">				
+				<!-- 公司名称 -->
+				<view class="form-item">
+					<view class="form-label">公司名称</view>
+					<input 
+						v-model="formData.companyName" 
+						placeholder="深圳市四海芯舟科技有限公司" 
+						class="form-input"
+					/>
+				</view>
+				
+				<!-- 公司业务类型 -->
+				<view class="form-item">
+					<view class="form-label" style="margin-bottom: 20rpx;">
+						<text class="required-mark">*</text>
+						<text class="label-text">公司业务类型</text>
+					</view>
+					<view class="checkbox-container">
+					<u-checkbox-group 
+						@change="checkboxGroupChange"
+						:wrap="false"
+						shape="square"
+						active-color="#007AFF"
+					>
+							<u-checkbox 
+								v-for="(option, index) in businessTypeOptions" 
+								:key="index"
+								:name="option.value"
+								v-model="option.checked"
+								class="checkbox-item"
+							>
+								{{ option.label }}
+							</u-checkbox>
+						</u-checkbox-group>
+					</view>
+				</view>
+			</view>
+			
+			<!-- 岗位履历 -->
+			<view class="form-section" v-for="(resume, index) in formData.resumes" :key="index">
+				<view class="section-title" v-if="hasCrossBorderExperience" >岗位履历 ({{ index + 1 }})</view>
+				
+				<!-- 任职时间 -->
+				<view class="form-item">
+					<view class="form-label">
+						<text class="required-mark">*</text>
+						<text class="label-text">{{ hasCrossBorderExperience ? '任职时间' : '在职时间' }}</text>
+					</view>
+					<view class="form-input" @click="selectEmploymentTime(index)">
+						<text v-if="resume.employmentTime">{{ resume.employmentTime }}</text>
+						<text v-else class="placeholder">{{ hasCrossBorderExperience ? '选择任职时间&离职时间' : '选择在职时间&离职时间' }}</text>
+						<u-icon name="calendar" color="#999" size="60"></u-icon>
+					</view>
+				</view>
+				
+				<!-- 所在部门 -->
+				<view class="form-item">
+					<view class="form-label">
+						<text class="required-mark">*</text>
+						<text class="label-text">所在部门</text>
+					</view>
+					<view class="form-input" @click="selectDepartment(index)">
+						<text v-if="resume.department">{{ resume.department }}</text>
+						<text v-else class="placeholder">请选择部门</text>
+						<u-icon name="arrow-down" color="#999" size="42"></u-icon>
+					</view>
+				</view>
+				
+				<!-- 岗位 -->
+				<view class="form-item">
+					<view class="form-label">
+						<text class="required-mark">*</text>
+						<text class="label-text">岗位</text>
+					</view>
+					<view class="form-input" @click="selectPosition(index)">
+						<text v-if="resume.position">{{ resume.position }}</text>
+						<text v-else class="placeholder">请选择岗位</text>
+						<u-icon name="arrow-down" color="#999" size="42"></u-icon>
+					</view>
+				</view>
+				
+				<!-- 岗位职级 -->
+				<view class="form-item">
+					<view class="form-label">岗位职级</view>
+					<view class="form-input" @click="selectPositionLevel(index)">
+						<text v-if="resume.positionLevel">{{ resume.positionLevel }}</text>
+						<text v-else class="placeholder">请选择职级</text>
+						<u-icon name="arrow-down" color="#999" size="42"></u-icon>
+					</view>
+				</view>
+				
+				<!-- 岗位职业技能 -->
+				<view class="form-item">
+					<view class="form-label">
+						<text class="required-mark">*</text>
+						<text class="label-text">岗位职业技能</text>
+					</view>
+					<view class="skills-input-container">
+						<view class="skills-tags">
+							<view 
+								v-for="(skill, skillIndex) in resume.skills" 
+								:key="skillIndex"
+								class="skill-tag"
+							>
+								<text>{{ skill }}</text>
+								<u-icon name="close" color="#999" size="16" @click="removeSkill(index, skillIndex)"></u-icon>
+							</view>
+						</view>
+						<view class="add-skill-btn" @click="addSkill(index)">
+							<u-icon name="plus" color="rgba(102, 102, 102, 1)" size="28"></u-icon>
+						</view>
+					</view>
+				</view>
+				
+				<!-- 工作内容 -->
+				<view class="form-item">
+					<view class="form-label">工作内容</view>
+					<view class="form-input" @click="selectWorkContent(index)">
+						<text v-if="resume.workContent">{{ resume.workContent }}</text>
+						<text v-else class="placeholder">选填,请输入</text>
+						<u-icon name="arrow-down" color="#999" size="42"></u-icon>
+					</view>
+				</view>
+				
+				<!-- 工作业绩 -->
+				<view class="form-item">
+					<view class="form-label">工作业绩</view>
+					<view class="form-input" @click="selectWorkPerformance(index)">
+						<text v-if="resume.workPerformance">{{ resume.workPerformance }}</text>
+						<text v-else class="placeholder">选填,请输入</text>
+						<u-icon name="arrow-down" color="#999" size="42"></u-icon>
+					</view>
+				</view>
+				
+				<!-- 添加岗位履历按钮 -->
+				<view class="add-resume-btn" @click="addResume" v-if="index === formData.resumes.length - 1 && hasCrossBorderExperience">
+					<text>添加岗位履历</text>
+				</view>
+			</view>
+		</view>
+		
+		<!-- 底部保存按钮 -->
+		<view class="bottom-btn-container">
+			<view class="save-btn" @click="saveWorkExperience">
+				<text>保存</text>
+			</view>
+		</view>
+		
+		<!-- 添加技能弹窗 -->
+		<u-popup v-model="showAddSkill" mode="center" border-radius="24" width="80%">
+			<view class="add-skill-popup">
+				<view class="popup-title">添加技能</view>
+				<view class="popup-content">
+					<input 
+						v-model="newSkillName" 
+						placeholder="请输入技能名称" 
+						class="skill-input"
+						maxlength="10"
+					/>
+				</view>
+				<view class="popup-buttons">
+					<view class="popup-btn cancel-btn" @click="cancelAddSkill">取消</view>
+					<view class="popup-btn confirm-btn" @click="confirmAddSkill">确定</view>
+				</view>
+			</view>
+		</u-popup>
+	</view>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			showAddSkill: false,
+			newSkillName: '',
+			currentResumeIndex: 0,
+			businessTypeOptions: [
+				{ label: '跨境电商', value: 'cross-border-ecommerce', checked: false },
+				{ label: '国内电商', value: 'domestic-ecommerce', checked: false },
+				{ label: '外贸', value: 'foreign-trade', checked: false },
+				{ label: '其他', value: 'other', checked: false }
+			],
+			formData: {
+				companyName: '',
+				businessTypes: [],
+				resumes: [{
+					employmentTime: '',
+					department: '运营部',
+					position: '亚马逊运营',
+					positionLevel: '资深',
+					skills: ['铺货', '品牌精品', '精品精铺', '店铺运营'],
+					workContent: '',
+					workPerformance: ''
+				}]
+			}
+		}
+	},
+	onLoad(options) {
+		// 接收从在线简历页面传递的业务类型参数
+		if (options.businessTypes) {
+			try {
+				const businessTypes = JSON.parse(decodeURIComponent(options.businessTypes))
+				this.formData.businessTypes = businessTypes
+				console.log('接收到的业务类型:', businessTypes)
+				console.log('是否有跨境经验:', this.hasCrossBorderExperience)
+			} catch (e) {
+				console.error('解析业务类型参数失败:', e)
+			}
+		}
+	},
+	computed: {
+		hasCrossBorderExperience() {
+			return this.formData.businessTypes.includes('cross-border-ecommerce')
+		}
+	},
+	methods: {
+		goBack() {
+			uni.navigateBack()
+		},
+		
+		checkboxGroupChange(e) {
+			console.log('选中的业务类型:', e)
+			// 更新 formData.businessTypes 以保持数据同步
+			this.formData.businessTypes = e
+		},
+
+		selectEmploymentTime(index) {
+			// 选择任职时间
+			uni.showToast({
+				title: '选择任职时间',
+				icon: 'none'
+			})
+		},
+		selectDepartment(index) {
+			// 选择部门
+			uni.showToast({
+				title: '选择部门',
+				icon: 'none'
+			})
+		},
+		selectPosition(index) {
+			// 选择岗位
+			uni.showToast({
+				title: '选择岗位',
+				icon: 'none'
+			})
+		},
+		selectPositionLevel(index) {
+			// 选择岗位职级
+			uni.showToast({
+				title: '选择岗位职级',
+				icon: 'none'
+			})
+		},
+		addSkill(index) {
+			this.currentResumeIndex = index
+			this.showAddSkill = true
+			this.newSkillName = ''
+		},
+		removeSkill(resumeIndex, skillIndex) {
+			this.formData.resumes[resumeIndex].skills.splice(skillIndex, 1)
+		},
+		cancelAddSkill() {
+			this.showAddSkill = false
+			this.newSkillName = ''
+		},
+		confirmAddSkill() {
+			if (this.newSkillName.trim()) {
+				this.formData.resumes[this.currentResumeIndex].skills.push(this.newSkillName.trim())
+				this.showAddSkill = false
+				this.newSkillName = ''
+			} else {
+				uni.showToast({
+					title: '请输入技能名称',
+					icon: 'none'
+				})
+			}
+		},
+		selectWorkContent(index) {
+			// 选择工作内容
+			uni.showToast({
+				title: '选择工作内容',
+				icon: 'none'
+			})
+		},
+		selectWorkPerformance(index) {
+			// 选择工作业绩
+			uni.showToast({
+				title: '选择工作业绩',
+				icon: 'none'
+			})
+		},
+		addResume() {
+			this.formData.resumes.push({
+				employmentTime: '',
+				department: '',
+				position: '',
+				positionLevel: '',
+				skills: [],
+				workContent: '',
+				workPerformance: ''
+			})
+		},
+		saveWorkExperience() {
+			uni.showToast({
+				title: '保存成功',
+				icon: 'success'
+			})
+			setTimeout(() => {
+				uni.navigateBack()
+			}, 1500)
+		}
+	}
+}
+</script>
+
+<style lang="scss" scoped>
+.work-experience {
+	min-height: 100vh;
+	padding-bottom: 120rpx;
+}
+
+.custom-navbar {
+	position: fixed;
+	top: 0;
+	left: 0;
+	right: 0;
+	padding-top: 80rpx;
+	background-color: #ffffff;
+	z-index: 9999;
+	
+	.navbar-content {
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		height: 100%;
+		padding: 0 40rpx;
+		
+		.nav-left, .nav-right {
+			width: 60rpx;
+			height: 60rpx;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+		}
+		
+		.nav-title {
+			color: rgba(51, 51, 51, 1);
+			font-family: DM Sans;
+			font-size: 36rpx;
+			font-weight: 700;
+			line-height: 26px;
+			letter-spacing: 0px;
+			text-align: center;
+		}
+	}
+}
+
+.main-content {
+	margin-top: 88rpx;
+	padding: 80rpx 20rpx 40rpx 20rpx;
+}
+
+.form-section {
+	background: #fff;
+	border-radius: 16rpx;
+	padding: 0rpx 10rpx;
+	
+	.section-title {
+		color: rgba(23, 23, 37, 1);
+		font-family: Inter;
+		font-size: 20px;
+		font-weight: 600;
+		line-height: 24px;
+		letter-spacing: 0%;
+		text-align: left;
+	}
+}
+
+.form-item {
+	margin-bottom: 30rpx;
+	
+	.form-label {
+			color: rgba(31, 44, 55, 1);
+			font-family: DM Sans;
+			font-size: 16px;
+			font-weight: 500;
+			line-height: 22px;
+			letter-spacing: 0%;
+			text-align: left;
+			margin-bottom: 20rpx;
+
+		.required-mark {
+			color: #FF3B30;
+			font-size: 18px;
+			font-weight: 500;
+			margin-right: 4rpx;
+		}
+		
+		.label-text {
+			color: rgba(31, 44, 55, 1);
+			font-family: DM Sans;
+			font-size: 16px;
+			font-weight: 500;
+			line-height: 22px;
+			letter-spacing: 0%;
+			text-align: left;
+		}
+	}
+	
+	.form-input {
+		width: 100%;
+		height: 80rpx;
+		padding: 0 40rpx;
+		border: 1px solid rgba(227, 231, 236, 1);
+		border-radius: 24px;
+		background: rgba(255, 255, 255, 1);
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		
+		.placeholder {
+			color: #999999;
+		}
+	}
+}
+
+.form-section {
+	margin-top: 40rpx;
+	
+	.section-title {
+		color: rgba(23, 23, 37, 1);
+		font-family: Inter;
+		font-size: 24px;
+		font-weight: 600;
+		line-height: 24px;
+		letter-spacing: 0%;
+		text-align: left;
+		margin-bottom: 40rpx;
+	}
+}
+
+.skills-input-container {
+	width: 100%;
+	min-height: 80rpx;
+	padding: 0rpx 40rpx;
+	border: 1px solid rgba(227, 231, 236, 1);
+	border-radius: 32px;
+	background: rgba(255, 255, 255, 1);
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	
+	.skills-tags {
+		display: flex;
+		flex-wrap: wrap;
+		gap: 12rpx;
+		flex: 1;
+		
+		.skill-tag {
+			padding: 8rpx 16rpx;
+			background: #F5F5F5;
+			border-radius: 8rpx;
+			display: flex;
+			align-items: center;
+			gap: 8rpx;
+			
+			text {
+				font-size: 24rpx;
+				color: #666666;
+			}
+		}
+	}
+	
+	.add-skill-btn {
+		width: 40rpx;
+		height: 40rpx;
+		border: 1rpx solid rgba(102, 102, 102, 1);
+		border-radius: 8rpx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		background: #fff;
+		flex-shrink: 0;
+	}
+}
+
+.add-resume-btn {
+	width: 100%;
+	height: 80rpx;
+	border: 1rpx solid #007AFF;
+	border-radius: 60rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	margin-top: 20rpx;
+	
+	text {
+		color: #007AFF;
+		font-size: 28rpx;
+		font-weight: 500;
+	}
+}
+
+.bottom-btn-container {
+	position: fixed;
+	bottom: 0;
+	left: 0;
+	right: 0;
+	padding: 30rpx 20rpx;
+	background: #fff;
+	border-top: 1px solid #f0f0f0;
+	z-index: 9999;
+}
+
+.save-btn {
+	width: 100%;
+	height: 88rpx;
+	background: linear-gradient(90deg, rgba(13, 39, 247, 1), rgba(19, 193, 234, 1) 100%);
+	border-radius: 44rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	
+	text {
+		font-size: 32rpx;
+		font-weight: 600;
+		color: #fff;
+	}
+}
+
+.add-skill-popup {
+	background: #fff;
+	border-radius: 24rpx;
+	padding: 40rpx;
+	
+	.popup-title {
+		color: rgba(34, 37, 42, 1);
+		font-size: 36rpx;
+		font-weight: 500;
+		text-align: center;
+		margin-bottom: 30rpx;
+	}
+	
+	.popup-content {
+		margin-bottom: 30rpx;
+		
+		.skill-input {
+			width: 100%;
+			height: 80rpx;
+			padding: 0 20rpx;
+			border: 1rpx solid #E5E5EA;
+			border-radius: 12rpx;
+			font-size: 28rpx;
+			color: rgba(34, 37, 42, 1);
+			background: #F7F8FA;
+		}
+	}
+	
+	.popup-buttons {
+		display: flex;
+		gap: 20rpx;
+		
+		.popup-btn {
+			flex: 1;
+			height: 80rpx;
+			border-radius: 12rpx;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			font-size: 28rpx;
+			font-weight: 500;
+		}
+		
+		.cancel-btn {
+			background: #F7F8FA;
+			color: rgba(102, 102, 102, 1);
+		}
+		
+		.confirm-btn {
+			background: #007AFF;
+			color: #fff;
+		}
+	}
+}
+
+.checkbox-container {
+	display: flex;
+	flex-wrap: nowrap;
+	gap: 10rpx;
+	
+	/deep/ .u-checkbox-group {
+		display: flex;
+		flex-wrap: nowrap;
+		width: 100%;
+	}
+	
+	/deep/ .u-checkbox {
+		flex: 1;
+		min-width: 0;
+		margin-right: 0;
+	}
+}
+</style>

+ 3 - 0
static/images/index/Path.svg

@@ -0,0 +1,3 @@
+<svg viewBox="0 0 19.5 19.9209" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="19.500000" height="19.920898" fill="none" customFrame="#000000">
+	<path id="Path" d="M5.52096 0.75C2.58427 0.75 0.75 2.38593 0.75 5.39303L0.75 14.4427C0.75 17.497 2.58427 19.1708 5.52096 19.1708L13.979 19.1708C16.925 19.1708 18.75 17.5254 18.75 14.5183L18.75 5.39303C18.7592 2.38593 16.9342 0.75 13.9883 0.75L5.52096 0.75Z" fill-rule="evenodd" stroke="rgb(23,23,37)" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" />
+</svg>