lsw 10 ヶ月 前
コミット
ccad7ef397

+ 1 - 1
app/App.vue

@@ -30,7 +30,7 @@ button::after {
 /**挂载iconfont字体图标*/
 @font-face {
 	font-family: 'iconfont';
-	src: url('https://at.alicdn.com/t/c/font_4507607_i7so1emprg.ttf?t=1718172901995') format('truetype');
+	src: url('https://at.alicdn.com/t/c/font_4507607_mw2qeijcty.ttf?t=1718292578740') format('truetype');
 	/* src: url('~@/static/font/iconfont.ttf') format('truetype'); */
 }
 .icon {

+ 35 - 14
app/common/common.scss

@@ -216,7 +216,7 @@
 	.top {
 		overflow: hidden;
 		.title {
-			font-size: 14px;
+			font-size: 15px;
 			padding-top: 3px;
 			font-weight: bold;
 			float: left;
@@ -233,9 +233,10 @@
 	}
 	.bot {
 		border-top: 1px solid $line;
-		font-size: 12px;
+		font-size: 13px;
 		color: $font-c;
 		padding-top: 10px;
+		overflow: hidden;
 		.address {
 			float: left;
 			width: 70%;
@@ -247,6 +248,16 @@
 			float: right;
 		}
 	}
+	.bt {
+		border: 0px;
+		padding-top: 3px;
+	}
+	.flex {
+		border-top: 1px solid $line;
+		padding-top: 10px;
+		font-size: 14px;
+		margin-top: 13px;
+	}
 }
 /**简历******/
 .resume {
@@ -334,7 +345,7 @@
 			border-radius: 3px;
 			text-align: center;
 			padding: 10px 5px 10px 5px;
-			font-size: 13px;
+			font-size: 14px;
 			color: $font-c;
 			background-color: #f3f3f3;
 		}
@@ -431,9 +442,20 @@
 		.top {
 			overflow: hidden;
 			.title {
-				font-size: 17px;
+				font-size: 16px;
 				float: left;
 				width: 71%;
+				font-weight: bold;
+				.icon{
+					
+				}
+			}
+			.salary {
+				font-size: 15px;
+				font-weight: bold;
+				color: #ff5722;
+				margin-bottom: 5px;
+				float: right;
 			}
 			.audit {
 				float: right;
@@ -447,7 +469,7 @@
 			margin-top: 10px;
 			color: $font-c;
 			width: 100%;
-			font-size: 13px;
+			font-size: 14px;
 			overflow: hidden;
 			.tag {
 				float: left;
@@ -455,14 +477,10 @@
 				border-radius: 3px;
 				margin-right: 7px;
 			}
-			.state {
-				font-size: 13px;
-				padding-right: 5px;
+			.date {
+				float: right;
 			}
 		}
-		.date {
-			font-size: 13px;
-		}
 		.flex {
 			border-top: 1px solid $line;
 			padding-top: 10px;
@@ -476,16 +494,19 @@
 .danger {
 	color: #f44336;
 }
+.agree {
+	color: $main-color;
+}
 .filters {
 	float: right;
 	margin-top: -32px;
 	color: $font-c;
-	z-index:111;
+	z-index: 111;
 	position: relative;
 	.icon {
 		padding-right: 3px;
 	}
 }
-.pt0{
+.pt0 {
 	padding-top: 0px;
-}
+}

+ 41 - 15
app/pages.json

@@ -4,6 +4,13 @@
 	},
 	"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
 		{
+			"path": "pages/index/index",
+			"style": {
+				"navigationBarTitleText": "爱就业咨询服务平台",
+				"enablePullDownRefresh": false
+			}
+		},
+		{
 			"path": "pages/job/list",
 			"style": {
 				"navigationBarTitleText": "找工作",
@@ -17,13 +24,6 @@
 			}
 		},
 		{
-			"path": "pages/index/index",
-			"style": {
-				"navigationBarTitleText": "爱就业咨询服务平台",
-				"enablePullDownRefresh": false
-			}
-		},
-		{
 			"path": "components/u-avatar-cropper/u-avatar-cropper",
 			"style": {
 				"navigationBarTitleText": "图片裁剪",
@@ -165,17 +165,43 @@
 			}
 		},
 		{
-			"path" : "pages/job/enterprise/detail",
-			"style" : 
-			{
-				"navigationBarTitleText" : "企业详情"
+			"path": "pages/job/enterprise/detail",
+			"style": {
+				"navigationBarTitleText": "企业详情"
 			}
 		},
 		{
-			"path" : "pages/job/enterprise/list",
-			"style" : 
-			{
-				"navigationBarTitleText" : "正在招聘职位"
+			"path": "pages/job/enterprise/list",
+			"style": {
+				"navigationBarTitleText": "正在招聘职位"
+			}
+		},
+		{
+			"path": "pages/user/resume/deliver/list",
+			"style": {
+				"navigationBarTitleText": "投递历史",
+				"enablePullDownRefresh": true
+			}
+		},
+		{
+			"path": "pages/user/resume/deliver/invite",
+			"style": {
+				"navigationBarTitleText": "面试邀约",
+				"enablePullDownRefresh": true
+			}
+		},
+		{
+			"path": "pages/user/resume/deliver/receive/index",
+			"style": {
+				"navigationBarTitleText": "收到简历",
+				"enablePullDownRefresh": true
+			}
+		},
+		{
+			"path": "pages/user/resume/deliver/receive/list",
+			"style": {
+				"navigationBarTitleText": "简历列表",
+				"enablePullDownRefresh": true
 			}
 		}
 	],

+ 43 - 10
app/pages/job/detail.vue

@@ -23,9 +23,20 @@
 				<map :latitude="item.latitude" :longitude="item.longitude" :markers="covers"></map>
 			</view>
 		</view>
-		<view class="footer">
-			<view class="td">
-				<button class="btn">投递简历</button>
+		<view class="mfooter">
+			<view class="cn">
+				<view class="tob">
+					<text class="icon">&#xe637;</text>
+					<view class="mtt">分享</view>
+				</view>
+				<view class="tob">
+					<text class="icon">&#xe626;</text>
+					<view class="mtt">收藏</view>
+				</view>
+				<button class="btn" @click="send()">
+					<text class="icon">&#xe652;</text>
+					<text>投递简历</text>
+				</button>
 			</view>
 		</view>
 	</view>
@@ -53,6 +64,15 @@ export default {
 	methods: {
 		go(url) {
 			uni.navigateTo({ url: url });
+		},
+		//投递简历
+		send() {
+			this.http.request({
+				url: '/app/deliver/send/' + this.item.id,
+				success: (res) => {
+					uni.showModal({content: '投递成功,等待企业回应',showCancel: false});
+				}
+			});
 		}
 	}
 };
@@ -122,14 +142,27 @@ export default {
 		height: 150px;
 	}
 }
-.footer {
-	position: fixed;
-	width: 100%;
-	bottom: 20px;
-	.td {
-		width: 100%;
+.mfooter {
+	background-color: white;
+	bottom: 0px;
+	border-top: 1px solid $line;
+	.cn {
+		padding: 10px 10px 18px 10px;
+		overflow: hidden;
+		.tob {
+			margin-right: 15px;
+			float: left;
+			color: $font-c;
+			.icon {
+				font-size: 28px;
+			}
+			.mtt {
+				font-size: 14px;
+			}
+		}
 		.btn {
-			width: 60%;
+			float: right;
+			margin-top: 5px;
 		}
 	}
 }

+ 1 - 1
app/pages/job/list.vue

@@ -1,5 +1,5 @@
 <template>
-	<view class="main">
+	<view class="main pt0">
 		<view class="search">
 			<u-search placeholder="搜索工作" :disabled="true" bgColor="white" :showAction="false" @click="go('/pages/job/search')"></u-search>
 		</view>

+ 12 - 5
app/pages/job/position/manage/list.vue

@@ -9,7 +9,10 @@
 			</view>
 			<view class="item" v-for="(item, index) in list" :key="index" @click="detail(item)">
 				<view class="top">
-					<view class="title omit">{{ item.title }}</view>
+					<view class="title omit">
+						<text class="icon" :style="{ color: item.state == 0 ? '#4CAF50' : '#545555' }">&#xe614;</text>
+						<text>{{ item.title }}</text>
+					</view>
 					<view class="audit" v-if="item.audit == 0">
 						<text class="icon">&#xe642;</text>
 						<text>审核中</text>
@@ -24,11 +27,12 @@
 					</view>
 				</view>
 				<view class="desc">
-					<text class="state" :style="{ color: item.state == 0 ? '#4CAF50' : '#F44336' }">{{ item.state == 0 ? '已启用' : '已关闭' }}</text>
-					<text class="tag">发布于:{{ item.createTime }}</text>
+					<text class="tag">{{ item.experience }}</text>
+					<text class="tag">{{ item.salary }}</text>
+					<text class="tag">{{ item.regionName }}</text>
+					<text class="date">{{ item.createTime }}</text>
 				</view>
 				<view class="flex">
-					<view class="f br">简历</view>
 					<view class="f br" @click.stop="manageState(item)">{{ item.state == 0 ? '关闭' : '启用' }}</view>
 					<view class="f danger" @click.stop="manageRemove(item)">删除</view>
 				</view>
@@ -81,7 +85,10 @@ export default {
 				loading: 'false',
 				success: (res) => {
 					this.loadMore = res.data.pages > this.param.pageNum ? true : false;
-					this.list.push(...res.data.rows);
+					res.data.rows.forEach((item) => {
+						item.createTime = uni.$u.timeFrom(Date.parse(item.createTime));
+						this.list.push(item);
+					});
 				}
 			});
 		},

+ 1 - 1
app/pages/job/search.vue

@@ -1,5 +1,5 @@
 <template>
-	<view class="main">
+	<view class="main pt0">
 		<view class="search">
 			<u-search placeholder="搜索工作" bgColor="white" v-model="param.title" :showAction="false" @search="search()" @clear="clear()"></u-search>
 		</view>

+ 20 - 12
app/pages/user/index.vue

@@ -12,7 +12,7 @@
 			</view>
 			<view class="icon">&#xe62b;</view>
 		</view>
-		<view class="rows">
+		<view class="rows" style="display: none">
 			<view class="row">
 				<view class="out">
 					<view class="int">
@@ -39,8 +39,8 @@
 			</view>
 		</view>
 		<!--政务服务-->
-		<view class="mtt">政务服务</view>
-		<view class="menu">
+		<view class="mtt" style="display: none">政务服务</view>
+		<view class="menu" style="display: none">
 			<view class="cd">
 				<view class="out">
 					<view class="int">
@@ -85,10 +85,18 @@
 						</view>
 					</view>
 				</view>
-				<view class="cd" @click="go('/pages/user/enterprise/index')">
+				<view class="cd" @click="go('/pages/user/resume/deliver/receive/index')">
 					<view class="out">
 						<view class="int">
 							<view class="icon" style="background-color: #03a9f4">&#xe627;</view>
+							<view class="title">收到简历</view>
+						</view>
+					</view>
+				</view>
+				<view class="cd" @click="go('/pages/user/enterprise/index')">
+					<view class="out">
+						<view class="int">
+							<view class="icon" style="background-color: #03a9f4">&#xe646;</view>
 							<view class="title">企业信息</view>
 						</view>
 					</view>
@@ -105,7 +113,7 @@
 					</view>
 				</view>
 			</view>
-			<view class="cd">
+			<view class="cd" @click="go('/pages/user/resume/deliver/invite')">
 				<view class="out">
 					<view class="int">
 						<view class="icon" style="background-color: #4caf50">&#xe605;</view>
@@ -113,10 +121,10 @@
 					</view>
 				</view>
 			</view>
-			<view class="cd">
+			<view class="cd" @click="go('/pages/user/resume/deliver/list')">
 				<view class="out">
 					<view class="int">
-						<view class="icon" style="background-color: #607d8b">&#xe68a;</view>
+						<view class="icon" style="background-color: #607d8b">&#xe6c8;</view>
 						<view class="title">投递历史</view>
 					</view>
 				</view>
@@ -135,16 +143,16 @@
 			<view class="cd">
 				<view class="out">
 					<view class="int">
-						<view class="icon" style="background-color: #2196f3">&#xe680;</view>
-						<view class="title">设置</view>
+						<view class="icon" style="background-color: #ff5722">&#xe616;</view>
+						<view class="title">分享有利</view>
 					</view>
 				</view>
 			</view>
 			<view class="cd">
 				<view class="out">
 					<view class="int">
-						<view class="icon" style="background-color: #ff5722">&#xe616;</view>
-						<view class="title">分享有利</view>
+						<view class="icon" style="background-color: #2196f3">&#xe680;</view>
+						<view class="title">设置</view>
 					</view>
 				</view>
 			</view>
@@ -160,7 +168,7 @@ export default {
 		};
 	},
 	onShow() {
-/* 		 this.user = {
+		/* 		 this.user = {
 				token: 'eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6ImQyYThiZTk5LThjY2MtNGFkMi05ODJlLTMzYzE3NTdiNDllOSJ9.YFzfq1YEDy1FmZ-2bynRDgQai6qMdfGFsgQCDMiStba-m4AdoqKx6hmfd7F5n2t9l1bgcxE9VVpC7M6TdWN72Q'
 			};
 			uni.setStorageSync('user', this.user); */

+ 111 - 0
app/pages/user/resume/deliver/invite.vue

@@ -0,0 +1,111 @@
+<template>
+	<view class="main pt0">
+		<view class="item_job" v-for="(item, index) in list" :key="index" @click="go('/pages/job/detail?id=' + item.positionId)">
+			<view class="top">
+				<view class="title omit">{{ item.title }}</view>
+				<view class="salary">{{ item.salary }}</view>
+			</view>
+			<view class="bot bt">
+				<view class="address omit">您好,邀请您过来面试。</view>
+				<view class="distance">{{ item.createTime }}</view>
+			</view>
+			<view class="flex">
+				<view class="f br agree" @click.stop="agree(item, 1)" v-if="item.isAccept == 0">同意</view>
+				<view class="f danger" @click.stop="agree(item, 2)" v-if="item.isAccept == 0">拒绝</view>
+				<view class="f danger" v-if="item.isAccept == 2">已拒绝</view>
+				<view class="f br agree" v-if="item.isAccept == 1">已同意</view>
+				<view class="f" @click.stop="navigation(item)" v-if="item.isAccept == 1">导航去面试</view>
+			</view>
+		</view>
+		<view class="loading" v-if="loadMore"><u-loadmore :status="loadMore ? 'loading' : 'nomore'" /></view>
+		<u-empty v-if="!loadMore && list.length == 0"></u-empty>
+	</view>
+</template>
+<script>
+export default {
+	data() {
+		return {
+			list: [],
+			param: { pageNum: 1, pageSize: 10, state: 1 },
+			loadMore: true
+		};
+	},
+	onLoad(e) {
+		this.getData();
+	},
+	methods: {
+		getData() {
+			this.http.request({
+				url: '/app/deliver/user/list',
+				data: this.param,
+				loading: 'false',
+				success: (res) => {
+					this.loadMore = res.data.pages > this.param.pageNum ? true : false;
+					res.data.rows.forEach((item) => {
+						item.createTime = uni.$u.timeFrom(Date.parse(item.createTime));
+						this.list.push(item);
+					});
+				}
+			});
+		},
+		go(url) {
+			uni.navigateTo({ url: url });
+		},
+		navigation(item) {
+			wx.openLocation({
+				latitude: Number(item.latitude),
+				longitude: Number(item.longitude),
+				scale: 18, // 缩放比例
+				success: (res) => {
+					console.log('导航成功');
+				},
+				fail: (res) => {
+					console.error('导航失败', res);
+				}
+			});
+		},
+		agree(item, isAccept) {
+			uni.showModal({
+				title: '提示',
+				content: isAccept == 1 ? '确定同意去面试' : '确定拒绝该邀请',
+				success: (res) => {
+					if (res.confirm) {
+						this.http.request({
+							url: '/app/deliver/agree',
+							data: { id: item.id, isAccept: isAccept },
+							method: 'POST',
+							success: (res) => {
+								uni.showToast({ title: '操作成功' });
+								item.isAccept = isAccept;
+							}
+						});
+					}
+				}
+			});
+		},
+		//刷新数据
+		refresh() {
+			this.loadMore = true;
+			this.param.pageNum = 1;
+			this.list = [];
+			this.getData();
+		}
+	},
+	//下拉刷新
+	onPullDownRefresh() {
+		setTimeout(() => {
+			this.refresh();
+			uni.stopPullDownRefresh();
+		}, 1000);
+	},
+	//上拉加载
+	onReachBottom() {
+		if (this.loadMore) {
+			this.param.pageNum++;
+			this.getData();
+		}
+	}
+};
+</script>
+
+<style lang="scss"></style>

+ 92 - 0
app/pages/user/resume/deliver/list.vue

@@ -0,0 +1,92 @@
+<template>
+	<view class="main pt0">
+		<view class="item_job" v-for="(item, index) in list" :key="index" @click="go('/pages/job/detail?id=' + item.positionId)">
+			<view class="top">
+				<view class="title omit">{{ item.title }}</view>
+				<view class="salary">{{ item.salary }}</view>
+			</view>
+			<view class="bot br">
+				<view class="address omit">{{ item.address }}</view>
+				<view class="distance">{{ item.createTime }}</view>
+			</view>
+			<view class="flex">
+				<view class="f danger" @click.stop="del(item)">删除</view>
+			</view>
+		</view>
+		<view class="loading" v-if="loadMore"><u-loadmore :status="loadMore ? 'loading' : 'nomore'" /></view>
+		<u-empty v-if="!loadMore && list.length == 0"></u-empty>
+	</view>
+</template>
+<script>
+export default {
+	data() {
+		return {
+			list: [],
+			param: { pageNum: 1, pageSize: 10 },
+			loadMore: true
+		};
+	},
+	onLoad(e) {
+		this.getData();
+	},
+	methods: {
+		getData() {
+			this.http.request({
+				url: '/app/deliver/user/list',
+				data: this.param,
+				loading: 'false',
+				success: (res) => {
+					this.loadMore = res.data.pages > this.param.pageNum ? true : false;
+					res.data.rows.forEach((item) => {
+						item.createTime = uni.$u.timeFrom(Date.parse(item.createTime));
+						this.list.push(item);
+					});
+				}
+			});
+		},
+		go(url) {
+			uni.navigateTo({ url: url });
+		},
+		del(item) {
+			uni.showModal({
+				title: '提示',
+				content: '确定删除该职位投递,删除后企业HR将无法看到你的简历',
+				success: (res) => {
+					if (res.confirm) {
+						this.http.request({
+							url: '/app/deliver/remove/' + item.id,
+							success: (res) => {
+								uni.showToast({ title: '删除成功' });
+								this.list.splice(this.list.indexOf(item), 1);
+							}
+						});
+					}
+				}
+			});
+		},
+		//刷新数据
+		refresh() {
+			this.loadMore = true;
+			this.param.pageNum = 1;
+			this.list = [];
+			this.getData();
+		}
+	},
+	//下拉刷新
+	onPullDownRefresh() {
+		setTimeout(() => {
+			this.refresh();
+			uni.stopPullDownRefresh();
+		}, 1000);
+	},
+	//上拉加载
+	onReachBottom() {
+		if (this.loadMore) {
+			this.param.pageNum++;
+			this.getData();
+		}
+	}
+};
+</script>
+
+<style lang="scss"></style>

+ 95 - 0
app/pages/user/resume/deliver/receive/index.vue

@@ -0,0 +1,95 @@
+<template>
+	<view class="main pt0">
+		<view class="item" v-for="(item, index) in list" :key="index" @click="go('/pages/user/resume/deliver/receive/list?id=' + item.id)">
+			<view class="title omit">{{ item.title }}</view>
+			<view class="desc">
+				<view class="progress">
+					<u-line-progress :percentage="(item.isRead / item.total).toFixed(2) * 100" :height="20" text="已读"></u-line-progress>
+				</view>
+				<view class="all">{{ item.total }}份</view>
+			</view>
+		</view>
+		<view class="loading" v-if="loadMore"><u-loadmore :status="loadMore ? 'loading' : 'nomore'" /></view>
+		<u-empty v-if="!loadMore && list.length == 0"></u-empty>
+	</view>
+</template>
+<script>
+export default {
+	data() {
+		return {
+			list: [],
+			param: { pageNum: 1, pageSize: 10 },
+			loadMore: true
+		};
+	},
+	onLoad(e) {
+		this.getData();
+	},
+	methods: {
+		getData() {
+			this.http.request({
+				url: '/app/deliver/receive',
+				data: this.param,
+				loading: 'false',
+				success: (res) => {
+					this.loadMore = res.data.pages > this.param.pageNum ? true : false;
+					this.list.push(...res.data.rows);
+				}
+			});
+		},
+		go(url) {
+			uni.navigateTo({ url: url });
+		},
+		//刷新数据
+		refresh() {
+			this.loadMore = true;
+			this.param.pageNum = 1;
+			this.list = [];
+			this.getData();
+		}
+	},
+	//下拉刷新
+	onPullDownRefresh() {
+		setTimeout(() => {
+			this.refresh();
+			uni.stopPullDownRefresh();
+		}, 1000);
+	},
+	//上拉加载
+	onReachBottom() {
+		if (this.loadMore) {
+			this.param.pageNum++;
+			this.getData();
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+.item {
+	background-color: white;
+	border-radius: 7px;
+	padding: 15px;
+	overflow: hidden;
+	margin-bottom: 12px;
+	.title {
+		border-radius: 3px;
+		font-weight: bold;
+		font-size: 18px;
+	}
+	.desc {
+		margin-top: 10px;
+		color: $font-c;
+		font-size: 15px;
+		margin-left: -5px;
+		.progress {
+			float: left;
+			width: 90%;
+		}
+		.all {
+			float: left;
+			padding-left: 5px;
+		}
+	}
+}
+</style>

+ 94 - 0
app/pages/user/resume/deliver/receive/list.vue

@@ -0,0 +1,94 @@
+<template>
+	<view class="main pt0">
+		<view class="item" v-for="(item, index) in list" :key="index" @click="go('/pages/user/resume/deliver/receive/list?id=' + item.id)">
+			<image :src="ip + item.avatar" mode="widthFix" class="avatar"></image>
+			<view class="con">
+				<view class="name">{{ item.name }}</view>
+				<text class="desc">{{ item.sex }} · {{ item.age }}岁 · {{ item.experience }}</text>
+			</view>
+		</view>
+		<view class="loading" v-if="loadMore"><u-loadmore :status="loadMore ? 'loading' : 'nomore'" /></view>
+		<u-empty v-if="!loadMore && list.length == 0"></u-empty>
+	</view>
+</template>
+<script>
+export default {
+	data() {
+		return {
+			ip: this.http.ip,
+			list: [],
+			param: { pageNum: 1, pageSize: 10, isRead: 0 },
+			loadMore: true
+		};
+	},
+	onLoad(e) {
+		this.param.positionId = e.id;
+		this.getData();
+	},
+	methods: {
+		getData() {
+			this.http.request({
+				url: '/app/deliver/receive/list',
+				data: this.param,
+				loading: 'false',
+				success: (res) => {
+					this.loadMore = res.data.pages > this.param.pageNum ? true : false;
+					this.list.push(...res.data.rows);
+				}
+			});
+		},
+		go(url) {
+			uni.navigateTo({ url: url });
+		},
+		//刷新数据
+		refresh() {
+			this.loadMore = true;
+			this.param.pageNum = 1;
+			this.list = [];
+			this.getData();
+		}
+	},
+	//下拉刷新
+	onPullDownRefresh() {
+		setTimeout(() => {
+			this.refresh();
+			uni.stopPullDownRefresh();
+		}, 1000);
+	},
+	//上拉加载
+	onReachBottom() {
+		if (this.loadMore) {
+			this.param.pageNum++;
+			this.getData();
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+.item {
+	background-color: white;
+	border-radius: 7px;
+	padding: 15px;
+	overflow: hidden;
+	margin-bottom: 12px;
+	.avatar {
+		float: left;
+		width: 50px;
+		height: 50px;
+		border-radius: 50%;
+	}
+	.con {
+		float: left;
+		padding-left: 10px;
+		.name {
+			font-weight: bold;
+			padding-bottom: 3px;
+		}
+		.desc {
+			color: $font-c;
+			font-size: 14px;
+		}
+	}
+}
+</style>

+ 31 - 27
app/uni_modules/uview-ui/components/u-line-progress/props.js

@@ -1,28 +1,32 @@
 export default {
-    props: {
-        // 激活部分的颜色
-        activeColor: {
-            type: String,
-            default: uni.$u.props.lineProgress.activeColor
-        },
-        inactiveColor: {
-            type: String,
-            default: uni.$u.props.lineProgress.color
-        },
-        // 进度百分比,数值
-        percentage: {
-            type: [String, Number],
-            default: uni.$u.props.lineProgress.inactiveColor
-        },
-        // 是否在进度条内部显示百分比的值
-        showText: {
-            type: Boolean,
-            default: uni.$u.props.lineProgress.showText
-        },
-        // 进度条的高度,单位px
-        height: {
-            type: [String, Number],
-            default: uni.$u.props.lineProgress.height
-        }
-    }
-}
+	props: {
+		// 激活部分的颜色
+		activeColor: {
+			type: String,
+			default: uni.$u.props.lineProgress.activeColor
+		},
+		inactiveColor: {
+			type: String,
+			default: uni.$u.props.lineProgress.color
+		},
+		// 进度百分比,数值
+		percentage: {
+			type: [String, Number],
+			default: uni.$u.props.lineProgress.inactiveColor
+		},
+		// 是否在进度条内部显示百分比的值
+		showText: {
+			type: Boolean,
+			default: uni.$u.props.lineProgress.showText
+		},
+		text: {
+			type: String,
+			default: '已读'
+		},
+		// 进度条的高度,单位px
+		height: {
+			type: [String, Number],
+			default: uni.$u.props.lineProgress.height
+		}
+	}
+}

+ 1 - 1
app/uni_modules/uview-ui/components/u-line-progress/u-line-progress.vue

@@ -17,7 +17,7 @@
 		    :style="[progressStyle]"
 		> 
 			<slot>
-				<text v-if="showText && percentage >= 10" class="u-line-progress__text">{{innserPercentage + '%'}}</text>
+				<text v-if="showText && percentage >= 10" class="u-line-progress__text">{{text}}:{{innserPercentage + '%'}}</text>
 			</slot> 
 		</view>
 	</view>

+ 22 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/api/Api_ResumeDeliverController.java

@@ -5,6 +5,8 @@ import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.web.work.api.config.BaseController;
 import com.ruoyi.web.work.domain.ResumeDeliver;
 import com.ruoyi.web.work.domain.dto.ResumeDeliverDto;
+import com.ruoyi.web.work.domain.vo.ReceiveListVo;
+import com.ruoyi.web.work.domain.vo.ReceiveVo;
 import com.ruoyi.web.work.service.IResumeDeliverService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
@@ -40,6 +42,21 @@ public class Api_ResumeDeliverController extends BaseController {
         return getDataTable(list);
     }
 
+    @GetMapping("/receive")
+    public TableDataInfo userList() {
+        startPage();
+        List<ReceiveVo> list = resumeDeliverService.receive(getUser().getId());
+        return getDataTable(list);
+    }
+
+    @GetMapping("/receive/list")
+    public TableDataInfo receiveList(ResumeDeliver resumeDeliver) {
+        resumeDeliver.setEnterpriseId(getUser().getId());
+        startPage();
+        List<ReceiveListVo> list = resumeDeliverService.receiveList(resumeDeliver);
+        return getDataTable(list);
+    }
+
     @PostMapping("/detail/{id}")
     public AjaxResult detail(@PathVariable("id") Long id) {
         return resumeDeliverService.detail(id);
@@ -50,6 +67,11 @@ public class Api_ResumeDeliverController extends BaseController {
         return resumeDeliverService.invite(id);
     }
 
+    @GetMapping("/remove/{id}")
+    public AjaxResult remove(@PathVariable("id") Long id) {
+        return resumeDeliverService.remove(id);
+    }
+
     @GetMapping("/send/{id}")
     public AjaxResult send(@PathVariable("id") Long id) {
         return resumeDeliverService.send(id);

+ 19 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/ResumeDeliver.java

@@ -50,5 +50,24 @@ public class ResumeDeliver{
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date updateTime;
 
+    @TableField(exist = false)
+    @ApiModelProperty(value = "职位名称")
+    private String title;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "薪资范围")
+    private String salary;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "详细地址")
+    private String address;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "经度")
+    private String longitude;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "维度")
+    private String latitude;
 
 }

+ 42 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/vo/ReceiveListVo.java

@@ -0,0 +1,42 @@
+package com.ruoyi.web.work.domain.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.Date;
+
+/**
+ * @author lsw
+ * @date 2024-06-07
+ */
+@Data
+@Accessors(chain = true)
+public class ReceiveListVo {
+
+    private Long id;
+
+    private Long resumeId;
+
+    private String name;
+
+    private String avatar;
+
+    private String sex;
+
+    private Integer age;
+
+    private String experience;
+
+    private Integer state;
+
+    private Integer isAccept;
+
+    private Integer isRead;
+
+    private Integer isContract;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+}

+ 24 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/vo/ReceiveVo.java

@@ -0,0 +1,24 @@
+package com.ruoyi.web.work.domain.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * @author lsw
+ * @date 2024-06-07
+ */
+@Data
+@Accessors(chain = true)
+public class ReceiveVo {
+
+    private Long id;
+
+    @ApiModelProperty(value = "职位名称")
+    private String title;
+
+    private Integer total;
+
+    private Integer isRead;
+
+}

+ 12 - 2
ruoyi-admin/src/main/java/com/ruoyi/web/work/mapper/ResumeDeliverMapper.java

@@ -1,8 +1,12 @@
 package com.ruoyi.web.work.mapper;
 
-import java.util.List;
-import com.ruoyi.web.work.domain.ResumeDeliver;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.web.work.domain.ResumeDeliver;
+import com.ruoyi.web.work.domain.vo.ReceiveListVo;
+import com.ruoyi.web.work.domain.vo.ReceiveVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * @author lsw
@@ -10,4 +14,10 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface ResumeDeliverMapper extends BaseMapper<ResumeDeliver> {
     List<ResumeDeliver> selectList(ResumeDeliver resumeDeliver);
+
+    List<ReceiveVo> receive(@Param("userId") Long userId);
+
+    List<ReceiveListVo> receiveList(ResumeDeliver resumeDeliver);
+
+    ResumeDeliver check(@Param("positionId") Long positionId, @Param("userId") Long userId);
 }

+ 23 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/service/IResumeDeliverService.java

@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.web.work.domain.ResumeDeliver;
 import com.ruoyi.web.work.domain.dto.ResumeDeliverDto;
+import com.ruoyi.web.work.domain.vo.ReceiveListVo;
+import com.ruoyi.web.work.domain.vo.ReceiveVo;
 
 import java.util.List;
 
@@ -47,4 +49,25 @@ public interface IResumeDeliverService extends IService<ResumeDeliver> {
      * @return
      */
     AjaxResult detail(Long id);
+
+    /**
+     * 删除投递
+     * @param id
+     * @return
+     */
+    AjaxResult remove(Long id);
+
+    /**
+     * 职位收到简历统计概要
+     * @param userId
+     * @return
+     */
+    List<ReceiveVo> receive(Long userId);
+
+    /**
+     * 职位收到的简历列表
+     * @param resumeDeliver
+     * @return
+     */
+    List<ReceiveListVo> receiveList(ResumeDeliver resumeDeliver);
 }

+ 29 - 1
ruoyi-admin/src/main/java/com/ruoyi/web/work/service/impl/ResumeDeliverServiceImpl.java

@@ -7,6 +7,8 @@ import com.ruoyi.web.work.api.util.AppUtil;
 import com.ruoyi.web.work.domain.Position;
 import com.ruoyi.web.work.domain.ResumeDeliver;
 import com.ruoyi.web.work.domain.dto.ResumeDeliverDto;
+import com.ruoyi.web.work.domain.vo.ReceiveListVo;
+import com.ruoyi.web.work.domain.vo.ReceiveVo;
 import com.ruoyi.web.work.mapper.ResumeDeliverMapper;
 import com.ruoyi.web.work.service.IPositionService;
 import com.ruoyi.web.work.service.IResumeDeliverService;
@@ -38,7 +40,11 @@ public class ResumeDeliverServiceImpl extends ServiceImpl<ResumeDeliverMapper, R
         if (position == null || position.getState() != 0 || position.getAudit() != 1) {
             return AjaxResult.error("该职位不存在或已下架");
         }
-        ResumeDeliver resumeDeliver = new ResumeDeliver();
+        ResumeDeliver resumeDeliver = resumeDeliverMapper.check(position.getId(), AppUtil.getUser().getId());
+        if (resumeDeliver != null) {
+            return AjaxResult.error("请勿重复投递简历");
+        }
+        resumeDeliver = new ResumeDeliver();
         resumeDeliver.setUserId(AppUtil.getUser().getId());
         resumeDeliver.setPositionId(position.getId());
         resumeDeliver.setEnterpriseId(position.getUserId());
@@ -86,4 +92,26 @@ public class ResumeDeliverServiceImpl extends ServiceImpl<ResumeDeliverMapper, R
         }
         return AjaxResult.success(resumeDeliver);
     }
+
+    @Override
+    public AjaxResult remove(Long id) {
+        ResumeDeliver resumeDeliver = getById(id);
+        if (resumeDeliver == null || !resumeDeliver.getUserId().equals(AppUtil.getUser().getId())) {
+            return AjaxResult.error("简历不存在或非法操作");
+        }
+        if (!removeById(id)) {
+            throw new ServiceException("删除投递失败");
+        }
+        return AjaxResult.success();
+    }
+
+    @Override
+    public List<ReceiveVo> receive(Long userId) {
+        return resumeDeliverMapper.receive(userId);
+    }
+
+    @Override
+    public List<ReceiveListVo> receiveList(ResumeDeliver resumeDeliver) {
+        return resumeDeliverMapper.receiveList(resumeDeliver);
+    }
 }

+ 0 - 25
ruoyi-admin/src/main/resources/EnterpriseMapper.xml

@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE mapper
-PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
-"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.ruoyi.web.work.mapper.EnterpriseMapper">
-    
-    <select id="selectList" resultType="com.ruoyi.web.work.domain.Enterprise">
-        select * from tb_enterprise
-        <where>  
-            <if test="name != null  and name != ''"> and name like concat('%', #{name}, '%')</if>
-            <if test="phone != null  and phone != ''"> and phone = #{phone}</if>
-            <if test="legalPerson != null  and legalPerson != ''"> and legal_person = #{legalPerson}</if>
-            <if test="email != null  and email != ''"> and email = #{email}</if>
-            <if test="capital != null  and capital != ''"> and capital = #{capital}</if>
-            <if test="createDate != null  and createDate != ''"> and create_date = #{createDate}</if>
-            <if test="address != null  and address != ''"> and address = #{address}</if>
-            <if test="contents != null  and contents != ''"> and contents = #{contents}</if>
-            <if test="p1 != null  and p1 != ''"> and p1 = #{p1}</if>
-            <if test="msg != null  and msg != ''"> and msg = #{msg}</if>
-            <if test="state != null "> and state = #{state}</if>
-            <if test="logo != null  and logo != ''"> and logo = #{logo}</if>
-        </where>
-    </select>
-
-</mapper>

+ 44 - 2
ruoyi-admin/src/main/resources/mapper/work/ResumeDeliverMapper.xml

@@ -11,11 +11,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         p.salary,
         p.region_name,
         p.address,
-        p.location
+        p.location,
+        p.longitude,
+        p.latitude
         FROM
         tb_resume_deliver d
         LEFT JOIN tb_position p ON p.id = d.position_id
-        WHERE
         <where>
             <if test="userId != null "> and d.user_id = #{userId}</if>
             <if test="enterpriseId != null "> and d.enterprise_id = #{enterpriseId}</if>
@@ -28,4 +29,45 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         ORDER BY d.id DESC
     </select>
 
+    <select id="check" resultType="com.ruoyi.web.work.domain.ResumeDeliver">
+        SELECT * FROM tb_resume_deliver WHERE position_id=#{positionId} AND user_id=#{userId}
+    </select>
+
+    <select id="receive" resultType="com.ruoyi.web.work.domain.vo.ReceiveVo">
+        SELECT
+            p.id,
+            p.title,
+            ( SELECT COUNT( d.id ) FROM tb_resume_deliver d WHERE d.position_id = p.id ) AS total,
+            ( SELECT COUNT( d.id ) FROM tb_resume_deliver d WHERE d.position_id = p.id AND d.is_read = 1 ) AS isRead
+        FROM
+            tb_position p
+        WHERE
+            p.user_id =#{userId}
+        GROUP BY
+            p.id
+        HAVING
+            total > 0
+        ORDER BY total DESC
+    </select>
+
+    <select id="receiveList" resultType="com.ruoyi.web.work.domain.vo.ReceiveListVo">
+        SELECT
+            r.id AS resumeId,
+            r.name,
+            r.avatar,
+            r.sex,
+            r.age,
+            r.experience,
+            d.*
+        FROM
+            tb_resume r
+                LEFT JOIN tb_resume_deliver d ON d.user_id = r.id
+        WHERE
+            d.position_id =#{positionId}
+            AND d.enterprise_id =#{enterpriseId}
+        <if test="state != null "> and d.state = #{state}</if>
+        <if test="isAccept != null "> and d.is_accept = #{isAccept}</if>
+        ORDER BY d.id DESC
+    </select>
+
 </mapper>