lsw 10 months ago
parent
commit
166e8502f6
36 changed files with 1865 additions and 589 deletions
  1. 79 69
      admin-ui/src/views/work/company/edit.vue
  2. 84 83
      admin-ui/src/views/work/company/index.vue
  3. 1 1
      app/App.vue
  4. 195 109
      app/common/common.scss
  5. 2 2
      app/common/http.js
  6. 48 18
      app/common/util.js
  7. 153 0
      app/components/avatar/avatar.vue
  8. 152 0
      app/components/multiSelector/multiSelector.vue
  9. 55 35
      app/pages.json
  10. 5 5
      app/pages/job/company.vue
  11. 1 1
      app/pages/job/detail.vue
  12. 1 1
      app/pages/serve/index.vue
  13. 0 113
      app/pages/user/index.scss
  14. 86 67
      app/pages/user/index.vue
  15. 76 74
      app/pages/user/login.vue
  16. 58 0
      app/pages/user/resume/advantage.vue
  17. 112 0
      app/pages/user/resume/base.vue
  18. 193 0
      app/pages/user/resume/index.vue
  19. 78 0
      app/pages/user/switch.vue
  20. 34 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/api/Api_NewsController.java
  21. 40 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/api/Api_ResumeController.java
  22. 6 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/api/Api_UserController.java
  23. 1 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/api/config/InterceptorConfig.java
  24. 12 8
      ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/Company.java
  25. 83 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/Resume.java
  26. 3 3
      ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/User.java
  27. 17 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/dto/ChoiceDto.java
  28. 84 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/dto/ResumeAdvantageDto.java
  29. 60 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/dto/ResumeBaseDto.java
  30. 13 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/mapper/ResumeMapper.java
  31. 26 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/service/IResumeService.java
  32. 3 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/service/IUserService.java
  33. 60 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/service/impl/ResumeServiceImpl.java
  34. 12 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/service/impl/UserServiceImpl.java
  35. 1 0
      ruoyi-admin/src/main/resources/mapper/work/CompanyMapper.xml
  36. 31 0
      ruoyi-admin/src/main/resources/mapper/work/ResumeMapper.xml

+ 79 - 69
admin-ui/src/views/work/company/edit.vue

@@ -1,30 +1,39 @@
 <template>
   <div class="cmain">
-    <el-form ref="form" :model="form" :rules="rules" label-width="110px">
+    <el-form ref="form" :model="form" :rules="rules" :disabled="param.detail" label-width="110px">
       <div class="bos">
         <div class="lab">
           <div class="bsg"></div>
           <div class="tit">企业信息</div>
         </div>
-        <el-form-item label="企业名称" prop="companyName">
-          <el-input v-model="form.companyName" placeholder="请输入企业名称" :disabled="param.detail" clearable />
-        </el-form-item>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="企业名称" prop="companyName">
+              <el-input v-model="form.companyName" placeholder="请输入企业名称" clearable />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="邮箱地址" prop="email">
+              <el-input v-model="form.email" placeholder="请输入邮箱" clearable />
+            </el-form-item>
+          </el-col>
+        </el-row>
         <el-row>
           <el-col :span="12">
             <el-form-item label="企业负责人" prop="director">
-              <el-input v-model="form.director" placeholder="请输入企业方负责人" clearable :disabled="param.detail" />
+              <el-input v-model="form.director" placeholder="请输入企业方负责人" clearable />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="手机号" prop="phone">
-              <el-input v-model="form.phone" placeholder="请输入手机号" clearable :disabled="param.detail" />
+              <el-input v-model="form.phone" placeholder="请输入手机号" clearable />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
           <el-col :span="12">
             <el-form-item label="联系地址" prop="address">
-              <el-input type="textarea" v-model="form.address" rows="4" placeholder="请输入联系地址" clearable :disabled="param.detail" />
+              <el-input type="textarea" v-model="form.address" rows="4" placeholder="请输入联系地址" clearable />
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -42,12 +51,12 @@
         <el-row>
           <el-col :span="12">
             <el-form-item label="开户行" prop="bankName">
-              <el-input v-model="form.bankName" placeholder="请输入开户行" clearable :disabled="param.detail" />
+              <el-input v-model="form.bankName" placeholder="请输入开户行" clearable />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="对公账号" prop="bankAccount">
-              <el-input v-model="form.bankAccount" placeholder="请输入对公账号" clearable :disabled="param.detail" />
+              <el-input v-model="form.bankAccount" placeholder="请输入对公账号" clearable />
             </el-form-item>
           </el-col>
         </el-row>
@@ -85,69 +94,70 @@
 </template>
 
 <script>
-export default {
-  data() {
-    return {
-      form: { password: 123456 },
-      rules: {
-        companyName: [{ required: true, message: '不能为空', trigger: 'blur' }],
-        director: [{ required: true, message: '不能为空', trigger: 'blur' }],
-        phone: [
-          { required: true, message: '不能为空', trigger: 'blur' },
-          {
-            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
-            message: '请输入正确的手机号码',
-            trigger: 'blur'
-          }
-        ],
-        address: [{ required: true, message: '不能为空', trigger: 'blur' }],
-        business: [{ required: true, message: '不能为空', trigger: 'blur' }],
-        bankName: [{ required: true, message: '不能为空', trigger: 'blur' }],
-        bankAccount: [{ required: true, message: '不能为空', trigger: 'blur' }],
-        b1: [{ required: true, message: '不能为空', trigger: 'blur' }],
-        userName: [{ required: true, message: '账号不能为空', trigger: 'blur' }],
-        password: [{ required: true, message: '密码不能为空', trigger: 'blur' }]
+  export default {
+    data() {
+      return {
+        form: { password: 123456 },
+        rules: {
+          companyName: [{ required: true, message: '不能为空', trigger: 'blur' }],
+          email: [{ required: true, message: '不能为空', trigger: 'blur' }],
+          director: [{ required: true, message: '不能为空', trigger: 'blur' }],
+          phone: [
+            { required: true, message: '不能为空', trigger: 'blur' },
+            {
+              pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+              message: '请输入正确的手机号码',
+              trigger: 'blur'
+            }
+          ],
+          address: [{ required: true, message: '不能为空', trigger: 'blur' }],
+          business: [{ required: true, message: '不能为空', trigger: 'blur' }],
+          bankName: [{ required: true, message: '不能为空', trigger: 'blur' }],
+          bankAccount: [{ required: true, message: '不能为空', trigger: 'blur' }],
+          b1: [{ required: true, message: '不能为空', trigger: 'blur' }],
+          userName: [{ required: true, message: '账号不能为空', trigger: 'blur' }],
+          password: [{ required: true, message: '密码不能为空', trigger: 'blur' }]
+        }
+      };
+    },
+    props: {
+      param: {
+        type: Object,
+        default: () => {
+          return {};
+        }
+      },
+      layerid: {
+        type: String
       }
-    };
-  },
-  props: {
-    param: {
-      type: Object,
-      default: () => {
-        return {};
+    },
+    mounted() {
+      if (this.param.id) {
+        this.ajax({ url: '/work/company/detail/' + this.param.id }).then((response) => {
+          this.form = response.data;
+        });
       }
     },
-    layerid: {
-      type: String
-    }
-  },
-  mounted() {
-    if (this.param.id) {
-      this.ajax({ url: '/work/company/detail/' + this.param.id }).then((response) => {
-        this.form = response.data;
-      });
-    }
-  },
-  methods: {
-    submitForm() {
-      this.$refs['form'].validate((valid) => {
-        if (valid) {
-          if (this.form.id) {
-            this.ajax({ method: 'post', url: '/work/company/edit', data: this.form }).then((response) => {
-              this.$modal.msgSuccess('修改成功');
-              this.$layer.close(this.layerid);
-              this.$parent.getList();
-            });
-          } else {
-            this.ajax({ method: 'post', url: '/work/company/add', data: this.form }).then((response) => {
-              this.$modal.msgSuccess('新增成功');
-              this.$layer.close(this.layerid);
-              this.$parent.getList();
-            });
+    methods: {
+      submitForm() {
+        this.$refs['form'].validate((valid) => {
+          if (valid) {
+            if (this.form.id) {
+              this.ajax({ method: 'post', url: '/work/company/edit', data: this.form }).then((response) => {
+                this.$modal.msgSuccess('修改成功');
+                this.$layer.close(this.layerid);
+                this.$parent.getList();
+              });
+            } else {
+              this.ajax({ method: 'post', url: '/work/company/add', data: this.form }).then((response) => {
+                this.$modal.msgSuccess('新增成功');
+                this.$layer.close(this.layerid);
+                this.$parent.getList();
+              });
+            }
           }
-        }
-      });
+        });
+      }
     }
-  }
-};
+  };
 </script>

+ 84 - 83
admin-ui/src/views/work/company/index.vue

@@ -29,10 +29,11 @@
     <el-table :data="response.rows" border height="calc(100vh - 270px)">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="企业名称" align="left" prop="companyName" />
-      <el-table-column label="企业方负责人" align="center" prop="director" width="120" />
-      <el-table-column label="手机号" align="center" prop="phone" width="150" />
-      <el-table-column label="账户余额(元)" align="center" prop="money" width="120" />
-      <el-table-column label="关联用户" align="center" prop="peoples" width="120" />
+      <el-table-column label="企业方负责人" align="center" prop="director" width="110" />
+      <el-table-column label="手机号" align="center" prop="phone" width="130" />
+      <el-table-column label="邮箱" align="center" prop="email" />
+      <el-table-column label="账户余额(元)" align="center" prop="money" width="100" />
+      <el-table-column label="关联用户" align="center" prop="peoples" width="100" />
       <el-table-column label="创建日期" align="center" prop="createTime" width="180" />
       <el-table-column label="账号状态" align="center" prop="state" width="100">
         <template slot-scope="scope">
@@ -59,89 +60,89 @@
 </template>
 
 <script>
-import edit from './edit';
-export default {
-  name: 'Company',
-  data() {
-    return {
-      showSearch: true,
-      response: {},
-      dateRange: [],
-      queryParams: {
-        pageNum: 1,
-        pageSize: 10,
-        companyName: null,
-        director: null,
-        phone: null,
-        state: null,
-        orderByColumn: 'id',
-        isAsc: 'desc'
-      }
-    };
-  },
-  created() {
-    this.getList();
-  },
-  methods: {
-    getList() {
-      if (this.dateRange) {
-        this.queryParams.dateBegin = this.dateRange[0];
-        this.queryParams.dateEnd = this.dateRange[1];
-      }
-      this.ajax({ url: '/work/company/list', data: this.queryParams }).then((response) => {
-        this.response = response;
-      });
+  import edit from './edit';
+  export default {
+    name: 'Company',
+    data() {
+      return {
+        showSearch: true,
+        response: {},
+        dateRange: [],
+        queryParams: {
+          pageNum: 1,
+          pageSize: 10,
+          companyName: null,
+          director: null,
+          phone: null,
+          state: null,
+          orderByColumn: 'id',
+          isAsc: 'desc'
+        }
+      };
     },
-    handleQuery() {
-      this.queryParams.pageNum = 1;
+    created() {
       this.getList();
     },
-    resetQuery() {
-      this.resetForm('queryForm');
-      this.dateRange = [];
-      this.handleQuery();
-    },
-    op(tag, row) {
-      if (tag == 'add') {
-        this.iframe({ obj: edit, param: {}, title: '新增企业', width: '60%', height: '80%' });
-      }
-      const id = row.id;
-      if (tag == 'detail') {
-        this.iframe({ obj: edit, param: { id: id, detail: true }, title: '查看企业信息', width: '60%', height: '70%' });
-      }
-      if (tag == 'edit') {
-        this.iframe({ obj: edit, param: { id: id }, title: '编辑企业', width: '60%', height: '70%' });
-      }
-      //账号状态
-      if (tag == 'change') {
-        let text = row.state === 0 ? '启用' : '停用';
-        this.$confirm('确认要' + text + '该企业? 停用后该企业所有账号都停用', '警告', { type: 'warning' })
-          .then(() => {
-            this.post({ url: '/work/company/lock', data: { id: row.id, state: row.state } })
-              .then((response) => {
-                this.$modal.msgSuccess(text + '成功');
-              })
-              .catch(() => {
-                row.state = row.state === 0 ? 1 : 0;
-              });
-          })
-          .catch(() => {
-            row.state = row.state === 0 ? 1 : 0;
+    methods: {
+      getList() {
+        if (this.dateRange) {
+          this.queryParams.dateBegin = this.dateRange[0];
+          this.queryParams.dateEnd = this.dateRange[1];
+        }
+        this.ajax({ url: '/work/company/list', data: this.queryParams }).then((response) => {
+          this.response = response;
+        });
+      },
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        this.getList();
+      },
+      resetQuery() {
+        this.resetForm('queryForm');
+        this.dateRange = [];
+        this.handleQuery();
+      },
+      op(tag, row) {
+        if (tag == 'add') {
+          this.iframe({ obj: edit, param: {}, title: '新增企业', width: '60%', height: '80%' });
+        }
+        const id = row.id;
+        if (tag == 'detail') {
+          this.iframe({ obj: edit, param: { id: id, detail: true }, title: '查看企业信息', width: '60%', height: '70%' });
+        }
+        if (tag == 'edit') {
+          this.iframe({ obj: edit, param: { id: id }, title: '编辑企业', width: '60%', height: '70%' });
+        }
+        //账号状态
+        if (tag == 'change') {
+          let text = row.state === 0 ? '启用' : '停用';
+          this.$confirm('确认要' + text + '该企业? 停用后该企业所有账号都停用', '警告', { type: 'warning' })
+            .then(() => {
+              this.post({ url: '/work/company/lock', data: { id: row.id, state: row.state } })
+                .then((response) => {
+                  this.$modal.msgSuccess(text + '成功');
+                })
+                .catch(() => {
+                  row.state = row.state === 0 ? 1 : 0;
+                });
+            })
+            .catch(() => {
+              row.state = row.state === 0 ? 1 : 0;
+            });
+        }
+      },
+      del(row) {
+        this.$confirm('是否确认删除选中企业?删除后该企业下的所有账号都被删除', '警告', { type: 'warning' }).then(() => {
+          this.get({ url: '/work/company/remove/' + row.id }).then((response) => {
+            this.$modal.msgSuccess('删除成功');
+            this.getList();
           });
-      }
-    },
-    del(row) {
-      this.$confirm('是否确认删除选中企业?删除后该企业下的所有账号都被删除', '警告', { type: 'warning' }).then(() => {
-        this.get({ url: '/work/company/remove/' + row.id }).then((response) => {
-          this.$modal.msgSuccess('删除成功');
-          this.getList();
         });
-      });
-    },
-    /** 导出按钮操作 */
-    handleExport() {
-      this.download('/work/company/export', { ...this.queryParams }, '企业信息.xlsx');
+      },
+      /** 导出按钮操作 */
+      handleExport() {
+        this.download('/work/company/export', { ...this.queryParams }, '企业信息.xlsx');
+      }
     }
-  }
-};
+  };
 </script>

+ 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_k7tryf81fl.ttf?t=1716877178929') format('truetype');
+	src: url('https://at.alicdn.com/t/c/font_4507607_ia406jjud4i.ttf?t=1717494862112') format('truetype');
 	/* src: url('~@/static/font/iconfont.ttf') format('truetype'); */
 }
 .icon {

+ 195 - 109
app/common/common.scss

@@ -1,7 +1,7 @@
-.bg{
+.bg {
 	margin-top: -46px;
 	margin-left: -10px;
-	image{
+	image {
 		width: 110%;
 	}
 }
@@ -35,49 +35,6 @@
 .mt10 {
 	margin-top: 10px;
 }
-.clear {
-	clear: both;
-}
-.r {
-	width: 100%;
-	overflow: hidden;
-}
-.r10 {
-	width: 10%;
-	float: left;
-}
-.r20 {
-	width: 20%;
-	float: left;
-}
-.r30 {
-	width: 30%;
-	float: left;
-}
-.r40 {
-	width: 40%;
-	float: left;
-}
-.r50 {
-	width: 50%;
-	float: left;
-}
-.r60 {
-	width: 60%;
-	float: left;
-}
-.r70 {
-	width: 70%;
-	float: left;
-}
-.r80 {
-	width: 80%;
-	float: left;
-}
-.r90 {
-	width: 90%;
-	float: left;
-}
 .flex {
 	display: flex;
 	text-align: center;
@@ -94,28 +51,20 @@
 	text-align: center;
 	padding: 5px;
 	box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.2);
+	margin-top: 15px;
 }
 .form_group {
-	padding: 9px 15px 9px 15px;
+	padding: 9px 10px 9px 10px;
 	overflow: hidden;
 	position: relative;
-	border-bottom: 1px solid $line;
 	&.form_group:last-child {
 		border-bottom: 0px;
 	}
 	.lable {
-		font-size: 15px;
+		font-size: 17px;
 		text-align: left;
 		position: relative;
-		float: left;
-		color: $font-c;
-		margin-top: 7px;
-		.limit {
-			padding-left: 8px;
-			font-size: 13px;
-			font-weight: normal;
-			color: darkgray;
-		}
+		font-weight: bold;
 	}
 	.re {
 		&::before {
@@ -130,7 +79,9 @@
 		}
 	}
 	.bgm {
+		border: 1px solid $line;
 		color: white;
+		background-color: white;
 		border-radius: 5px;
 		margin-top: 12px;
 		position: relative;
@@ -153,72 +104,81 @@
 		height: 55px;
 		border-radius: 50%;
 	}
+	picker {
+		position: relative;
+		.more {
+			position: absolute;
+			right: 7px;
+			top: 13px;
+			font-weight: normal;
+		}
+	}
 	input {
 		font-size: 15px;
 		border-radius: 5px;
-		padding: 10px 5px 10px 10px;
-		width: 72%;
-		float: right;
-		text-align: right;
-	}
-	picker {
-		position: relative;
-		text-align: right;
-		width: 72%;
-		float: right;
-		line-height: 0px;
-		padding: 17px 7px 20px 0px;
+		padding: 10px;
+		margin-top: 12px;
+		border: 1px solid $line;
+		background-color: white;
 	}
 	textarea {
 		font-size: 15px;
 		border-radius: 5px;
 		padding: 10px;
-		margin-top: 40px;
+		margin-top: 12px;
 		height: 120px;
 		width: 93%;
-		background-color: #f1f1f1;
+		border: 1px solid $line;
 	}
-	.more {
-		position: absolute;
-		right: 3px;
-		top: 18px;
-		font-weight: normal;
+	.start {
+		flex: 1;
+		margin-top: -17px;
+		text-align: left;
+	}
+	.hor {
+		flex: 1;
+		text-align: center;
+		color: white;
+		padding-top: 5px;
+	}
+}
+.bz {
+	font-size: 12px;
+	color: $font-c;
+	margin-top: 7px;
+	.icon {
+		padding-right: 3px;
 	}
 }
-/*****设置**********/
-.cmd {
-	margin-top: 30px;
+.menu {
+	margin-top: 12px;
 	overflow: hidden;
+	background-color: white;
 	border-radius: 10px;
-	.s_item {
-		padding: 10px;
-		background-color: white;
-		color: $font-c;
-		overflow: hidden;
-		border-bottom: 1px solid #f0f2f7;
-		&:last-child {
-			border-bottom: 0px;
-		}
-		.ic {
-			float: left;
-			font-size: 25px;
-			text-align: center;
-			padding: 7px;
-			border-radius: 50%;
-			border: 1px solid $main-color;
-			color: $main-color;
-		}
-		.title {
-			color: #545555;
-			padding-top: 11px;
-			float: left;
-			padding-left: 10px;
-		}
-		.arrow {
-			font-size: 20px;
-			float: right;
-			color: #9a9a9a;
-			margin-top: 10px;
+	box-shadow: $box-shadow;
+	.cd {
+		float: left;
+		width: 25%;
+		text-align: center;
+		.out {
+			padding: 5px;
+			.int {
+				padding: 8px 5px 8px 5px;
+				.icon {
+					font-size: 30px;
+					width: 50px;
+					height: 50px;
+					margin: 0 auto;
+					color: white;
+					border-radius: 8px;
+					line-height: 52px;
+					box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+				}
+				.title {
+					font-size: 14px;
+					padding-top: 5px;
+				}
+			}
 		}
 	}
 }
@@ -264,7 +224,7 @@
 				background-color: white;
 				overflow: hidden;
 				border-radius: 7px;
-				box-shadow:$box-shadow;
+				box-shadow: $box-shadow;
 				image {
 					width: 100%;
 					height: 100px;
@@ -340,3 +300,129 @@
 		}
 	}
 }
+/**简历******/
+.resume {
+	padding: 15px;
+	.row {
+		padding: 10px;
+		margin-bottom: 15px;
+		border-radius: 5px;
+		font-size: 14px;
+		background-color: white;
+		overflow: hidden;
+		.top {
+			.sm6 {
+				float: left;
+				.name {
+					font-size: 22px;
+					font-weight: bold;
+					.icon {
+						padding-left: 10px;
+					}
+				}
+			}
+			.tx {
+				width: 55px;
+				height: 55px;
+				border-radius: 50%;
+				position: absolute;
+				right: 34px;
+			}
+		}
+		.label {
+			padding-bottom: 15px;
+			.title {
+				font-size: 17px;
+				font-weight: bold;
+			}
+			.icon {
+				float: right;
+				font-weight: bold;
+				margin-top: 2px;
+				font-size: 20px;
+			}
+		}
+		.ellip {
+			line-height: 25px;
+		}
+		.item {
+			.title {
+				float: left;
+				font-size: 17px;
+				font-weight: bold;
+			}
+			.right {
+				float: right;
+			}
+		}
+		.con {
+			margin-bottom: 7px;
+			.tit {
+				font-weight: bold;
+				.left {
+					float: left;
+					width: 60%;
+					.salary {
+						padding-left: 10px;
+						color: orange;
+					}
+				}
+				.right {
+					float: right;
+					font-weight: normal;
+					.date {
+						font-size: 13px;
+					}
+					.icon {
+					}
+				}
+			}
+		}
+		.desc {
+			margin-top: 5px;
+			overflow: hidden;
+			.text {
+				padding-right: 3px;
+				float: left;
+			}
+			.bf {
+				padding-right: 7px;
+			}
+			.inf {
+				float: left;
+				text-align: left;
+				padding-right: 15px;
+				.icon {
+					padding-right: 5px;
+				}
+			}
+		}
+	}
+}
+.yd {
+	width: 4px;
+	height: 4px;
+	border-radius: 50%;
+	background-color: $font-c;
+	float: left;
+	margin-top: 9px;
+	margin-right: 3px;
+}
+.lav {
+	margin-bottom: 20px;
+	padding-left: 7px;
+	padding-right: 7px;
+	.icon {
+		font-size: 40px;
+		padding-bottom: 10px;
+	}
+	.title {
+		font-size: 22px;
+		font-weight: bold;
+	}
+	.desc {
+		font-size: 14px;
+		margin-top: 10px;
+		color: $font-c;
+	}
+}

+ 2 - 2
app/common/http.js

@@ -1,5 +1,5 @@
-//const ip = 'http://127.0.0.1:9191';
-const ip = 'https://chenglantimes.com/prod-api';
+const ip = 'http://127.0.0.1:9191';
+//const ip = 'https://chenglantimes.com/prod-api';
 //const ip = 'http://192.168.0.104:9191';
 /**
  * 封装的http请求

+ 48 - 18
app/common/util.js

@@ -2,40 +2,29 @@ function formatTime(time) {
 	if (typeof time !== 'number' || time < 0) {
 		return time
 	}
-
 	var hour = parseInt(time / 3600)
 	time = time % 3600
 	var minute = parseInt(time / 60)
 	time = time % 60
 	var second = time
-
 	return ([hour, minute, second]).map(function(n) {
 		n = n.toString()
 		return n[1] ? n : '0' + n
 	}).join(':')
 }
 
-const hasPermi = (permi) => {
-	let list = uni.getStorageSync('user').roles;
-	let has = list.filter(item => item.roleName == permi);
-	return has.length > 0 ? true : false;
-}
-
 function formatLocation(longitude, latitude) {
 	if (typeof longitude === 'string' && typeof latitude === 'string') {
 		longitude = parseFloat(longitude)
 		latitude = parseFloat(latitude)
 	}
-
 	longitude = longitude.toFixed(2)
 	latitude = latitude.toFixed(2)
-
 	return {
 		longitude: longitude.toString().split('.'),
 		latitude: latitude.toString().split('.')
 	}
 }
-
 //获取两日期之间日期列表函数
 function getdiffdate(stime, etime) {
 	//初始化日期列表,数组
@@ -44,22 +33,17 @@ function getdiffdate(stime, etime) {
 	//开始日期小于等于结束日期,并循环
 	while (stime <= etime) {
 		diffdate[i] = stime;
-
 		//获取开始日期时间戳
 		var stime_ts = new Date(stime).getTime();
-
 		//增加一天时间戳后的日期
 		var next_date = stime_ts + (24 * 60 * 60 * 1000);
-
 		//拼接年月日,这里的月份会返回(0-11),所以要+1
 		var next_dates_y = new Date(next_date).getFullYear() + '-';
 		var next_dates_m = (new Date(next_date).getMonth() + 1 < 10) ? '0' + (new Date(next_date).getMonth() + 1) +
 			'-' : (new Date(next_date).getMonth() + 1) + '-';
 		var next_dates_d = (new Date(next_date).getDate() < 10) ? '0' + new Date(next_date).getDate() : new Date(
 			next_date).getDate();
-
 		stime = next_dates_y + next_dates_m + next_dates_d;
-
 		//增加数组key
 		i++;
 	}
@@ -162,6 +146,12 @@ const getDate = (obj = 'day') => {
 	day = day > 9 ? day : '0' + day;
 	Hours = Hours > 9 ? Hours : '0' + Hours;
 	Minutes = Minutes > 9 ? Minutes : '0' + Minutes;
+	if (obj == 'year') {
+		return `${year}`;
+	}
+	if (obj == 'month') {
+		return `${month}`;
+	}
 	if (obj == 'day') {
 		return `${year}-${month}-${day}`;
 	}
@@ -170,6 +160,47 @@ const getDate = (obj = 'day') => {
 	}
 }
 /**
+ * 一些固定的基础数据
+ */
+const getData = (obj = 'education') => {
+	//性别
+	if (obj == 'state') {
+		return ["离职-随时到岗", "在职-月内到岗", "在职-考虑机会", "在职-暂不考虑"]
+	}
+	//性别
+	if (obj == 'sex') {
+		return ["男", "女"]
+	}
+	//学历
+	if (obj == 'qualification') {
+		return ["初中及以下", "中专/中技", "高中", "大专", "本科", "硕士", "博士"]
+	}
+	//求职类型
+	if (obj == 'types') {
+		return ["全职", "兼职", "任务"]
+	}
+	//工作经验
+	if (obj == 'experience') {
+		return ["不限", "1年以内", "1-3年", "3-5年", "5-10年", "10年以上"]
+	}
+	//职位要求
+	if (obj == 'positionName') {
+		return ["不限", "选择职位"]
+	}
+	//工作地点
+	if (obj == 'address') {
+		return ["不限", "选择工作地点"]
+	}
+	//人员规模
+	if (obj == 'nums') {
+		return ["0-20人", "20-99人", "100-499人", "500-999人", "1000-9999人", "10000人以上"]
+	}
+	// 结算方式
+	if(obj == 'unit') {
+		return ["日结", "单结",]
+	}
+}
+/**
  * 格式化时间
  */
 const format = (obj) => {
@@ -185,7 +216,6 @@ const format = (obj) => {
 	Minutes = Minutes > 9 ? Minutes : '0' + Minutes;
 	return `${year}-${month}-${day}` + ' ' + Hours + ':' + Minutes;
 }
-
 module.exports = {
 	formatTime: formatTime,
 	formatLocation: formatLocation,
@@ -196,5 +226,5 @@ module.exports = {
 	getDate: getDate,
 	getDaysBetween: getDaysBetween,
 	getdiffdate: getdiffdate,
-	hasPermi: hasPermi
+	getData: getData
 }

+ 153 - 0
app/components/avatar/avatar.vue

@@ -0,0 +1,153 @@
+<!--头像剪裁上传(单张)-->
+<template>
+	<view class="avatar">
+		<image :src="ip + head" mode="widthFix" class="head" @click="show = true" v-if="head"></image>
+		<image style="background-color: white" class="head" @click="show = true" v-else></image>
+		<!--头像上传-->
+		<u-popup :show="show" @close="show = false" round="15">
+			<view class="ppopup">
+				<view v-show="desc">
+					<view class="form_group">
+						<view class="lable">
+							<text class="icon right">&#xe612;</text>
+							<text>正确示范</text>
+						</view>
+						<view class="bz"><text>上传真实头像,更容易获得好感</text></view>
+						<image src="https://chenglantimes.com/prod-api/profile/upload/2024/06/04/1717489936671.jpg" mode="widthFix" class="avatar" style="border-radius: 5px"></image>
+					</view>
+					<view class="form_group">
+						<view class="lable">
+							<text class="icon error">&#xe634;</text>
+							<text>不佳示范</text>
+						</view>
+						<view class="flex" style="margin-top: 5px">
+							<view class="f">
+								<view class="cdn">
+									<image src="https://chenglantimes.com/prod-api/profile/upload/2024/06/04/1717489842705.jpg" class="img"></image>
+									<view class="desc">非人物照</view>
+								</view>
+							</view>
+							<view class="f">
+								<view class="cdn">
+									<image src="https://chenglantimes.com/prod-api/profile/upload/2024/06/04/1717489862536.jpg" class="img"></image>
+									<view class="desc">五官遮挡</view>
+								</view>
+							</view>
+							<view class="f">
+								<view class="cdn">
+									<image src="https://chenglantimes.com/prod-api/profile/upload/2024/06/04/1717489936671.jpg" class="img" style="filter: blur(2px)"></image>
+									<view class="desc">模糊不清</view>
+								</view>
+							</view>
+							<view class="f">
+								<view class="cdn">
+									<image src="https://chenglantimes.com/prod-api/profile/upload/2024/06/04/1717489876080.jpg" class="img"></image>
+									<view class="desc">衣着不当</view>
+								</view>
+							</view>
+						</view>
+					</view>
+				</view>
+				<button class="btn" @click="chooseImage('camera ')">拍照</button>
+				<button class="btn" @click="chooseImage('album')">从相册选择</button>
+			</view>
+		</u-popup>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'avatar',
+		props: {
+			value: {
+				type: String
+			},
+			desc: {
+				type: Boolean,
+				default: true
+			}
+		},
+		data() {
+			return {
+				show: false,
+				head: this.value,
+				ip: this.http.ip
+			};
+		},
+		watch: {
+			value(newValue) {
+				this.head = newValue;
+			}
+		},
+		mounted() {
+			// 监听从裁剪页发布的事件,获得裁剪结果
+			uni.$on('uAvatarCropper', path => {
+				uni.showLoading({ title: '正在上传...', mask: true });
+				// 上传到服务端
+				uni.uploadFile({
+					url: this.http.ip + '/app/common/upload',
+					filePath: path,
+					name: 'file',
+					header: { Authorization: this.getUser().token },
+					success: res => {
+						let r = JSON.parse(res.data);
+						if (r.code === 200) {
+							this.head = r.fileName;
+							this.$emit('input', r.fileName);
+						} else {
+							uni.hideLoading();
+							uni.showModal({ content: r.msg, showCancel: false });
+						}
+					}
+				});
+			});
+		},
+		methods: {
+			chooseImage(source) {
+				this.show = false;
+				uni.navigateTo({
+					url: '/components/u-avatar-cropper/u-avatar-cropper?destWidth=300&rectWidth=200&fileType=jpg&source=' + source
+				});
+			}
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	.avatar {
+		.head {
+			width: 55px;
+			height: 55px;
+			border-radius: 50%;
+		}
+		.ppopup {
+			padding: 30px 20px 40px 20px;
+			border-radius: 15px 15px 0px 0px;
+			.right {
+				font-size: 16px;
+				padding-right: 5px;
+				color: green;
+			}
+			.error {
+				font-size: 16px;
+				padding-right: 5px;
+				color: orange;
+			}
+			.cdn {
+				font-size: 13px;
+				overflow: hidden;
+				margin: 5px;
+				.img {
+					width: 60px;
+					height: 60px;
+					margin: 0 auto;
+					margin-bottom: 3px;
+					border-radius: 5px;
+				}
+			}
+			.btn {
+				margin-top: 20px;
+			}
+		}
+	}
+</style>

+ 152 - 0
app/components/multiSelector/multiSelector.vue

@@ -0,0 +1,152 @@
+<template>
+	<view>
+		<picker mode="multiSelector" :range="list" @columnchange="columnchange" @change="change">
+			<input :placeholder="placeholder" v-model="title" :disabled="true" placeholder-class="pc" />
+			<view class="icon more" v-if="icon">&#xe8f2;</view>
+		</picker>
+	</view>
+</template>
+
+<script>
+export default {
+	name: 'multiSelector',
+	props: {
+		range: {
+			type: Array
+		},
+		name: {
+			type: String,
+			default: '时间段'
+		},
+		icon: {
+			type: Boolean,
+			default: true
+		},
+		placeholder: {
+			type: String,
+			default: '请选择'
+		},
+		value: {
+			type: String
+		}
+	},
+	data() {
+		return {
+			title: this.value,
+			list: this.range,
+			multiIndex: [0, 0]
+		};
+	},
+	watch: {
+		value(newValue) {
+			this.title = newValue;
+		}
+	},
+	mounted() {
+		let year = parseInt(this.util.getDate('year'));
+		let month = parseInt(this.util.getDate('month'));
+		if (this.name == '出生年月') {
+			for (let i = 1970; i <= year - 16; i++) {
+				this.list[0].unshift(i + '年');
+			}
+			for (let i = 1; i <= 12; i++) {
+				this.list[1].push((i < 10 ? '0' + i : i) + '月');
+			}
+		}
+		if (this.name == '薪资') {
+			for (let i = 1; i <= 250; i++) {
+				this.list[0].push(i + 'k');
+			}
+		}
+		if (this.name == '时间段') {
+			for (let i = 1990; i <= year; i++) {
+				this.list[0].unshift(i);
+			}
+			for (let i = year + 1; i <= year + 8; i++) {
+				this.list[1].push(i);
+			}
+		}
+		if (this.name == '开始时间') {
+			for (let i = 1990; i <= year; i++) {
+				this.list[0].unshift(i + '年');
+			}
+			for (let i = 1; i <= month; i++) {
+				this.list[1].push((i < 10 ? '0' + i : i) + '月');
+			}
+		}
+		if (this.name == '结束时间') {
+			for (let i = 1990; i <= year; i++) {
+				this.list[0].unshift(i + '年');
+			}
+			this.list[0].unshift('至今');
+		}
+	},
+	methods: {
+		columnchange(e) {
+			this.multiIndex[e.detail.column] = e.detail.value;
+			if (e.detail.column == 0) {
+				this.list[0].forEach((item, index) => {
+					if (this.multiIndex[0] == index) {
+						let array = [];
+						let year = this.util.getDate('year') + '年';
+						let month = parseInt(this.util.getDate('month'));
+						//选择教育经历时间段
+						if (this.name == '时间段') {
+							for (let i = parseInt(this.list[0][this.multiIndex[0]]) + 1; i <= parseInt(this.list[0][this.multiIndex[0]]) + 8; i++) {
+								if (this.list[0][this.multiIndex[0]] == '1990以前') {
+									array = ['1990以前'];
+								} else {
+									array.push(i);
+								}
+							}
+							this.list[1] = array;
+						}
+						//选择薪资要求
+						if (this.name == '薪资') {
+							for (let i = parseInt(e.detail.value) + 1; i <= parseInt(e.detail.value) + 5; i++) {
+								if (e.detail.value > 0) {
+									array.push(i + 'k');
+								}
+							}
+							this.list[1] = array;
+						}
+						//选择时间范围
+						if (this.name == '开始时间' || this.name == '结束时间') {
+							//如果是今年只取当前月以前月份
+							month = this.list[0][this.multiIndex[0]] == year ? month : 12;
+							for (let i = 1; i <= month; i++) {
+								if (this.list[0][this.multiIndex[0]] != '1990以前' && this.list[0][this.multiIndex[0]] != '至今') {
+									array.push((i < 10 ? '0' + i : i) + '月');
+								}
+							}
+							this.list[1] = array;
+						}
+						//选择出生年月
+						if (this.name == '出生年月') {
+							for (let i = 1; i <= 12; i++) {
+								array.push((i < 10 ? '0' + i : i) + '月');
+							}
+							this.list[1] = array;
+						}
+					}
+				});
+			}
+
+			this.$forceUpdate();
+		},
+		change(e) {
+			if (this.list[0][this.multiIndex[0]]) {
+				this.title = this.list[0][this.multiIndex[0]];
+			}
+			if (this.list[1][this.multiIndex[1]]) {
+				this.title = this.list[0][this.multiIndex[0]] + '-' + this.list[1][this.multiIndex[1]];
+			}
+			this.title = this.title.replace('年', '').replace('月', '');
+			this.$emit('input', this.title);
+			this.$forceUpdate();
+		}
+	}
+};
+</script>
+
+<style lang="scss"></style>

+ 55 - 35
app/pages.json

@@ -4,30 +4,30 @@
 	},
 	"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
 		{
-			"path": "pages/clsd/index/index",
+			"path": "pages/index/index",
 			"style": {
 				"navigationBarTitleText": "爱就业咨询服务平台",
 				"enablePullDownRefresh": false
 			}
 		},
 		{
-			"path": "pages/index/index",
+			"path": "components/u-avatar-cropper/u-avatar-cropper",
 			"style": {
-				"navigationBarTitleText": "结算广场"
+				"navigationBarTitleText": "图片裁剪",
+				"navigationBarBackgroundColor": "#000000"
 			}
 		},
 		{
-			"path": "pages/packages/index",
+			"path": "pages/statement/index/index",
 			"style": {
-				"navigationBarTitleText": "结算广场",
-				"enablePullDownRefresh": true
+				"navigationBarTitleText": "结算广场"
 			}
 		},
 		{
-			"path": "pages/user/index",
+			"path": "pages/statement/packages/index",
 			"style": {
-				"navigationBarTitleText": "我的",
-				"enablePullDownRefresh": false
+				"navigationBarTitleText": "结算广场",
+				"enablePullDownRefresh": true
 			}
 		},
 		{
@@ -38,21 +38,21 @@
 			}
 		},
 		{
-			"path": "pages/auth/index",
+			"path": "pages/statement/auth/index",
 			"style": {
 				"navigationBarTitleText": "实名认证",
 				"enablePullDownRefresh": false
 			}
 		},
 		{
-			"path": "pages/company/index",
+			"path": "pages/statement/company/index",
 			"style": {
 				"navigationBarTitleText": "关联企业",
 				"enablePullDownRefresh": true
 			}
 		},
 		{
-			"path": "pages/company/search",
+			"path": "pages/statement/company/search",
 			"style": {
 				"navigationBarTitleText": "搜索企业",
 				"enablePullDownRefresh": false
@@ -66,56 +66,76 @@
 			}
 		},
 		{
-			"path": "pages/clsd/job/full_time",
+			"path": "pages/job/full_time",
 			"style": {
 				"navigationBarTitleText": "找工作",
 				"enablePullDownRefresh": false
 			}
 		},
 		{
-			"path": "pages/clsd/job/part_time",
+			"path": "pages/job/part_time",
 			"style": {
 				"navigationBarTitleText": "兼职零工",
 				"enablePullDownRefresh": false
 			}
 		},
 		{
-			"path": "pages/clsd/serve/index",
+			"path": "pages/serve/index",
 			"style": {
 				"navigationBarTitleText": "更多服务",
 				"enablePullDownRefresh": false
 			}
 		},
 		{
-			"path" : "pages/clsd/my/index",
-			"style" : 
-			{
-				"navigationBarTitleText" : "我的",
-				"enablePullDownRefresh" : false
+			"path": "pages/user/index",
+			"style": {
+				"navigationBarTitleText": "我的",
+				"enablePullDownRefresh": false
 			}
 		},
 		{
-			"path" : "pages/clsd/job/detail",
-			"style" : 
-			{
-				"navigationBarTitleText" : "工作详情"
+			"path": "pages/job/detail",
+			"style": {
+				"navigationBarTitleText": "工作详情"
 			}
 		},
 		{
-			"path" : "pages/clsd/job/company",
-			"style" : 
-			{
-				"navigationBarTitleText" : "公司信息"
+			"path": "pages/job/company",
+			"style": {
+				"navigationBarTitleText": "公司信息"
+			}
+		},
+		{
+			"path": "pages/other/webview",
+			"style": {
+				"navigationBarTitleText": "政策资讯"
+			}
+		},
+		{
+			"path": "pages/user/switch",
+			"style": {
+				"navigationBarTitleText": ""
+			}
+		},
+		{
+			"path": "pages/user/resume/index",
+			"style": {
+				"navigationBarTitleText": "我的简历"
 			}
 		},
 		{
-			"path" : "pages/other/webview",
+			"path": "pages/user/resume/base",
+			"style": {
+				"navigationBarTitleText": "个人信息"
+			}
+		},
+		{
+			"path" : "pages/user/resume/advantage",
 			"style" : 
 			{
-				"navigationBarTitleText" : "政策资讯"
+				"navigationBarTitleText" : "个人优势"
 			}
 		}
-
 	],
 	"tabBar": {
 		"color": "#7A7E83",
@@ -123,19 +143,19 @@
 		"borderStyle": "black",
 		"backgroundColor": "#F8F8F8",
 		"list": [{
-				"pagePath": "pages/clsd/index/index",
+				"pagePath": "pages/index/index",
 				"iconPath": "static/tab/sy.png",
 				"selectedIconPath": "static/tab/sy_s.png",
 				"text": "首页"
-			},	
+			},
 			{
-				"pagePath": "pages/clsd/serve/index",
+				"pagePath": "pages/serve/index",
 				"iconPath": "static/tab/serve.png",
 				"selectedIconPath": "static/tab/serve_s.png",
 				"text": "更多服务"
 			},
 			{
-				"pagePath": "pages/clsd/my/index",
+				"pagePath": "pages/user/index",
 				"iconPath": "static/tab/my.png",
 				"selectedIconPath": "static/tab/my_s.png",
 				"text": "我的"

+ 5 - 5
app/pages/job/company.vue

@@ -2,7 +2,7 @@
 	<view>
 		<view class="main">
 			<view class="ms" @click="detail()">
-				<image src="../../../static/favicon.png" mode="widthFix"></image>
+				<image src="../../static/favicon.png" mode="widthFix"></image>
 				<view class="con">
 					<view class="mti">广西龙坚贸易有限公司</view>
 					<view class="address">南宁青秀山航洋城1433</view>
@@ -17,14 +17,14 @@
 				<view class="r50">
 					<view class="int">
 						<view class="out">
-							<image src="../../../static/a1.png" mode="widthFix"></image>
+							<image src="../../static/a1.png" mode="widthFix"></image>
 						</view>
 					</view>
 				</view>
 				<view class="r50">
 					<view class="int">
 						<view class="out">
-							<image src="../../../static/a1.png" mode="widthFix"></image>
+							<image src="../../static/a1.png" mode="widthFix"></image>
 						</view>
 					</view>
 				</view>
@@ -53,12 +53,12 @@ export default {
 				{
 					latitude: 39.909,
 					longitude: 116.39742,
-					iconPath: '../../../static/location.png'
+					iconPath: '../../static/location.png'
 				},
 				{
 					latitude: 39.9,
 					longitude: 116.39,
-					iconPath: '../../../static/location.png'
+					iconPath: '../../static/location.png'
 				}
 			]
 		};

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

@@ -16,7 +16,7 @@
 				<view class="item">6、暑假工/临时工勿扰</view>
 			</view>
 			<view class="ms" @click="detail()">
-				<image src="../../../static/favicon.png" mode="widthFix"></image>
+				<image src="../../static/favicon.png" mode="widthFix"></image>
 				<view class="con">
 					<view class="mti">广西龙坚贸易有限公司</view>
 					<view class="address">南宁青秀山航洋城1433</view>

+ 1 - 1
app/pages/serve/index.vue

@@ -91,7 +91,7 @@
 			</view>
 		</view>
 		<!--横幅-->
-		<image src="../../../static/banner.jpg" mode="widthFix" class="hengfu" @click="webview('https://chenglantimes.com/a1')"></image>
+		<image src="../../static/banner.jpg" mode="widthFix" class="hengfu" @click="webview('https://chenglantimes.com/a1')"></image>
 		<!--图片内容-->
 		<view class="ad" style="margin-left: -10px; margin-right: -10px">
 			<view class="item" style="height: 190px">

+ 0 - 113
app/pages/user/index.scss

@@ -1,113 +0,0 @@
-.main {
-	padding: 5px 15px 25px 15px;
-	.user {
-		overflow: hidden;
-		image {
-			float: left;
-			width: 60px;
-			height: 60px;
-			border-radius: 50%;
-		}
-		.con {
-			float: left;
-			padding-left: 15px;
-			.nickName {
-				padding-top: 5px;
-			}
-			.welcome {
-				font-size: 13px;
-				padding-top: 5px;
-				color: #989898;
-			}
-		}
-		.icon {
-			float: right;
-			margin-top: 14px;
-		}
-	}
-	.rows {
-		overflow: hidden;
-		margin-top: 10px;
-		.row {
-			float: left;
-			width: 33%;
-			text-align: center;
-			.out {
-				.int {
-					padding: 5px;
-					.num {
-						font-weight: bold;
-					}
-					.desc {
-						padding-top: 5px;
-						font-size: 14px;
-					}
-				}
-			}
-		}
-	}
-	.mtt{
-		margin-top: 10px;
-	}
-	.menu {
-		margin-top: 12px;
-		overflow: hidden;
-		background-color: white;
-		border-radius: 10px;
-		box-shadow:$box-shadow;
-		.cd {
-			float: left;
-			width: 25%;
-			text-align: center;
-			.out {
-				padding: 5px;
-				.int {
-					padding: 8px 5px 8px 5px;
-					.icon {
-						font-size: 30px;
-						width: 50px;
-						height: 50px;
-						margin: 0 auto;
-						color: white;
-						border-radius: 8px;
-						line-height: 52px;
-						box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
-					}
-					.title {
-						font-size: 14px;
-						padding-top: 5px;
-					}
-				}
-			}
-		}
-	}
-	.hengfu {
-		width: 100%;
-		border-radius: 7px;
-		margin-top: 10px;
-		box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.2);
-	}
-	.ad {
-		.item {
-			float: left;
-			width: 50%;
-			overflow: hidden;
-			.out {
-				padding: 10px 10px 10px 10px;
-				.int {
-					overflow: hidden;
-					border-radius: 7px;
-					image {
-						border-radius: 7px;
-						box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.2);
-					}
-				}
-			}
-		}
-		.it {
-			overflow: hidden;
-			border-radius: 7px;
-			box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.2);
-		}
-	}
-}

+ 86 - 67
app/pages/user/index.vue

@@ -74,44 +74,46 @@
 				</view>
 			</view>
 		</view>
-		<view class="mtt">企业服务</view>
-		<view class="menu">
-			<view class="cd">
-				<view class="out">
-					<view class="int">
-						<view class="icon" style="background-color: #03A9F4">&#xe627;</view>
-						<view class="title">任务列表</view>
+		<view v-if="user.type==1">
+			<view class="mtt">企业服务</view>
+			<view class="menu">
+				<view class="cd">
+					<view class="out">
+						<view class="int">
+							<view class="icon" style="background-color: #03A9F4">&#xe627;</view>
+							<view class="title">任务列表</view>
+						</view>
 					</view>
 				</view>
-			</view>
-			<view class="cd">
-				<view class="out">
-					<view class="int">
-						<view class="icon" style="background-color: #3f51b5">&#xec5e;</view>
-						<view class="title">合同列表</view>
+				<view class="cd">
+					<view class="out">
+						<view class="int">
+							<view class="icon" style="background-color: #3f51b5">&#xec5e;</view>
+							<view class="title">合同列表</view>
+						</view>
 					</view>
 				</view>
-			</view>
-			<view class="cd">
-				<view class="out">
-					<view class="int">
-						<view class="icon" style="background-color: #795548">&#xe61d;</view>
-						<view class="title">交付进度</view>
+				<view class="cd">
+					<view class="out">
+						<view class="int">
+							<view class="icon" style="background-color: #795548">&#xe61d;</view>
+							<view class="title">交付进度</view>
+						</view>
 					</view>
 				</view>
-			</view>
-			<view class="cd">
-				<view class="out">
-					<view class="int">
-						<view class="icon" style="background-color: #607d8b">&#xe60a;</view>
-						<view class="title">邀请列表</view>
+				<view class="cd">
+					<view class="out">
+						<view class="int">
+							<view class="icon" style="background-color: #607d8b">&#xe60a;</view>
+							<view class="title">邀请列表</view>
+						</view>
 					</view>
 				</view>
 			</view>
 		</view>
 		<view class="mtt">求职服务</view>
 		<view class="menu">
-			<view class="cd">
+			<view class="cd" @click="go('/pages/user/resume/index')">
 				<view class="out">
 					<view class="int">
 						<view class="icon" style="background-color: #3f51b5">&#xe606;</view>
@@ -174,8 +176,8 @@
 			};
 		},
 		onShow() {
-			/* 		 		   this.user = {
-				token: 'eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6ImI0M2FmZjFmLWQ1YWMtNDk3Yi1hNDNiLTEwYTRiMmJmYmI4YiJ9.2IEItPPaVUBQw416MK9SA6OM_PE5WgcpvTdVf_-KJ8AQsI1J9PzMlRiA2ZCQT6gdHbY9l9wS1ZxQzdIxTx9PjQ'
+			/* this.user = {
+				token: 'eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjFlNTk3MjE5LTg3OTAtNDU1MC04ZTlkLWE5YjY2NDUwMDhjOCJ9.j9oyRK-cDoKSN1Elc6VmF8F99qOTdJei00bP35HkQdkuEvyL2xIhFCl2cihcBtQhIYDoUAl5yoYrTdxEI_lSrg'
 			};
 			uni.setStorageSync('user', this.user); */
 			if (this.hasLogin()) {
@@ -188,53 +190,19 @@
 					url: '/app/user/info',
 					success: (res) => {
 						this.user = res.data.data;
+						if (res.data.data.type == null) {
+							uni.navigateTo({ url: '/pages/user/switch' });
+						}
 					}
 				});
 			},
 			go(url) {
 				if (this.hasLogin()) {
-					if (url == 'index') {
-						uni.navigateTo({ url: '/pages/index/index' });
-					}
-					if (url == 'auth') {
-						uni.navigateTo({ url: '/pages/auth/index' });
-					}
-					if (url == 'company' && this.user.isAuthentication === 1) {
-						uni.navigateTo({ url: '/pages/company/index' });
-					}
-					if (url == 'packages' && this.user.isCompany > 0 && this.user.isContract == 1) {
-						uni.switchTab({ url: '/pages/packages/index' });
-					}
-					if (url == 'contract' && this.user.isContract == 1) {
-						this.look();
-					}
-					if (url == 'info') {
-						uni.navigateTo({ url: '/pages/user/info' });
-					}
+					uni.navigateTo({ url: url });
 				} else {
 					uni.navigateTo({ url: '/pages/user/login' });
 				}
 			},
-			//查看合同
-			look() {
-				uni.showLoading({ title: '正在打开合同...', mask: true });
-				uni.downloadFile({
-					url: this.user.isContract == 0 ? this.ip + this.contract.url : this.ip + '/app/contract/look',
-					header: { Authorization: this.getUser().token },
-					success: (res) => {
-						uni.openDocument({
-							filePath: res.tempFilePath,
-							showMenu: true,
-							success: (res) => {
-								uni.hideLoading();
-							}
-						});
-					},
-					fail: (res) => {
-						uni.hideLoading();
-					}
-				});
-			},
 			//退出登录
 			exit(url) {
 				uni.showModal({
@@ -260,5 +228,56 @@
 	};
 </script>
 <style lang="scss">
-	@import 'index.scss';
+	.main {
+		padding: 5px 15px 25px 15px;
+		.user {
+			overflow: hidden;
+			image {
+				float: left;
+				width: 60px;
+				height: 60px;
+				border-radius: 50%;
+			}
+			.con {
+				float: left;
+				padding-left: 15px;
+				.nickName {
+					padding-top: 5px;
+				}
+				.welcome {
+					font-size: 13px;
+					padding-top: 5px;
+					color: #989898;
+				}
+			}
+			.icon {
+				float: right;
+				margin-top: 14px;
+			}
+		}
+		.rows {
+			overflow: hidden;
+			margin-top: 10px;
+			.row {
+				float: left;
+				width: 33%;
+				text-align: center;
+				.out {
+					.int {
+						padding: 5px;
+						.num {
+							font-weight: bold;
+						}
+						.desc {
+							padding-top: 5px;
+							font-size: 14px;
+						}
+					}
+				}
+			}
+		}
+		.mtt {
+			margin-top: 10px;
+		}
+	}
 </style>

+ 76 - 74
app/pages/user/login.vue

@@ -1,90 +1,92 @@
 <template>
 	<view class="bg">
-		<view class="p"><image src="../../static/favicon.png" class="pic" mode="widthFix"></image></view>
+		<view class="p">
+			<image src="../../static/favicon.png" class="pic" mode="widthFix"></image>
+		</view>
 		<view class="title">承揽时代:</view>
 		<view class="info">您的公开信息(昵称,头像等)</view>
 		<button class="btn" @click="getUserProfile()" :disabled="disabled">微信一键登录</button>
 	</view>
 </template>
 <script>
-export default {
-	data() {
-		return {
-			disabled: false //防止重复点击
-		};
-	},
-	methods: {
-		getUserProfile() {
-			this.disabled = true;
-			let code = '';
-			uni.login({
-				provider: 'weixin',
-				success: (res) => {
-					code = res.code;
-				}
-			});
-			//获取用户信息
-			uni.getUserProfile({
-				desc: '用于完善会员资料',
-				lang: 'zh_CN',
-				provider: 'weixin',
-				success: (info) => {
-					let item = info.userInfo;
-					item.code = code;
-					this.http.request({
-						url: '/app/user/login',
-						data: item,
-						method: 'POST',
-						success: (res) => {
-							this.disabled = false;
-							uni.setStorageSync('user', res.data.data);
-							uni.navigateBack();
-						},
-						fail: (res) => {
-							this.disabled = false;
-						}
-					});
-				},
-				fail: (res) => {
-					this.disabled = false;
-				}
-			});
+	export default {
+		data() {
+			return {
+				disabled: false //防止重复点击
+			};
 		},
-		cancel() {
-			uni.navigateBack();
+		methods: {
+			getUserProfile() {
+				this.disabled = true;
+				let code = '';
+				uni.login({
+					provider: 'weixin',
+					success: (res) => {
+						code = res.code;
+					}
+				});
+				//获取用户信息
+				uni.getUserProfile({
+					desc: '用于完善会员资料',
+					lang: 'zh_CN',
+					provider: 'weixin',
+					success: (info) => {
+						let item = info.userInfo;
+						item.code = code;
+						this.http.request({
+							url: '/app/user/login',
+							data: item,
+							method: 'POST',
+							success: (res) => {
+								this.disabled = false;
+								uni.setStorageSync('user', res.data.data);
+								uni.navigateBack();
+							},
+							fail: (res) => {
+								this.disabled = false;
+							}
+						});
+					},
+					fail: (res) => {
+						this.disabled = false;
+					}
+				});
+			},
+			cancel() {
+				uni.navigateBack();
+			}
 		}
-	}
-};
+	};
 </script>
 
 <style lang="scss">
-.bg {
-	padding: 30px;
-	.p {
-		text-align: center;
-		padding: 15px;
-		.pic {
-			width: 90px;
-			height: 90px;
-			border-radius: 50%;
+	.bg {
+		padding: 30px;
+		.p {
+			text-align: center;
+			padding: 15px;
+			.pic {
+				width: 90px;
+				height: 90px;
+				border-radius: 50%;
+			}
 		}
-	}
-	.title {
-		font-weight: bold;
-		font-size: 16px;
-		color: $font-c;
-	}
-	.info {
-		color: #8b918d;
-		margin-top: 10px;
-		font-size: 13px;
-		.icon {
-			padding-right: 3px;
+		.title {
+			font-weight: bold;
+			font-size: 16px;
+			color: $font-c;
+		}
+		.info {
+			color: #8b918d;
+			margin-top: 10px;
+			font-size: 13px;
+			.icon {
+				padding-right: 3px;
+			}
+		}
+		.btn {
+			margin-top: 20px;
+			border-radius: 30px;
 		}
 	}
-	.btn {
-		margin-top: 20px;
-		border-radius: 30px;
-	}
-}
-</style>
+</style>

+ 58 - 0
app/pages/user/resume/advantage.vue

@@ -0,0 +1,58 @@
+<template>
+	<view class="main">
+		<view class="lav">
+			<view class="title">我的优势</view>
+			<view class="desc">一句话介绍自己,突出核心优势</view>
+		</view>
+		<textarea cols="30" maxlength="200" rows="10" v-model="item.advantage" placeholder="等待输入内容"></textarea>
+		<view class="f"><button class="btn" @click="save()">保存</button></view>
+	</view>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			item: {}
+		};
+	},
+	onLoad(e) {
+		if (e.item && e.item != 'null') {
+			this.item.advantage = e.item;
+		}
+	},
+	methods: {
+		save() {
+			let rule = [{ name: 'advantage', checkType: 'notnull', errorMsg: '请输入内容' }];
+			if (!this.verify.check(this.item, rule)) {
+				uni.showModal({ content: this.verify.error, showCancel: false });
+				return false;
+			}
+			this.http.request({
+				url: '/app/resume/advantage',
+				data: this.item,
+				method: 'POST',
+				success: (res) => {
+					uni.showToast({ title: '操作成功' });
+					setTimeout(() => {
+						uni.$emit('resume');
+						uni.navigateBack();
+					}, 1500);
+				}
+			});
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+textarea {
+	padding: 10px;
+	height: 200px;
+	width: 94%;
+	border-radius: 5px;
+	background-color: white;
+	font-size: 14px;
+	line-height: 23px;
+}
+</style>

+ 112 - 0
app/pages/user/resume/base.vue

@@ -0,0 +1,112 @@
+<template>
+	<view>
+		<view class="main">
+			<view class="form_group">
+				<view class="lable re">头像</view>
+				<view class="bz">
+					<text class="icon">&#xe634;</text>
+					<text>使用真实头像更容易得到HR的青睐</text>
+				</view>
+				<avatar v-model="item.avatar" class="avatar"></avatar>
+			</view>
+			<view class="form_group">
+				<view class="lable re">姓名</view>
+				<input placeholder="请输入姓名" v-model="item.name" />
+			</view>
+			<view class="form_group">
+				<view class="lable re">性别</view>
+				<picker :range="dict.sex" @change="picker($event, 'sex')">
+					<input placeholder="请选择性别" v-model="item.sex" :disabled="true" />
+					<view class="icon more">&#xe8f2;</view>
+				</picker>
+			</view>
+			<view class="form_group">
+				<view class="lable re">出生年月</view>
+				<multiSelector v-model="item.birthday" :range="dict.birthday" name="出生年月" placeholder="请选择出生年月"></multiSelector>
+			</view>
+			<view class="form_group">
+				<view class="lable">最高学历</view>
+				<picker :range="dict.qualification" @change="picker($event, 'qualification')">
+					<input placeholder="请选择学历" v-model="item.qualification" :disabled="true" />
+					<view class="icon more">&#xe8f2;</view>
+				</picker>
+			</view>
+			<view class="form_group">
+				<view class="lable re">参加工作时间</view>
+				<picker mode="date" fields="month" :end="end" @change="picker($event, 'joinDate')">
+					<input placeholder="请选择参加工作时间" v-model="item.joinDate" :disabled="true" />
+					<view class="icon more">&#xe8f2;</view>
+				</picker>
+			</view>
+			<view class="form_group">
+				<view class="lable re">手机号</view>
+				<input type="number" placeholder="请输入手机号" v-model="item.phone" />
+			</view>
+			<view class="form_group">
+				<view class="lable re">邮箱</view>
+				<input placeholder="请输入邮箱" v-model="item.email" />
+			</view>
+			<button class="btn" @click="save()">保存</button>
+		</view>
+	</view>
+</template>
+<script>
+export default {
+	data() {
+		return {
+			item: {},
+			end: this.util.getDate('day'),
+			dict: {
+				sex: this.util.getData('sex'),
+				qualification: this.util.getData('qualification'),
+				birthday: [[], []]
+			}
+		};
+	},
+	onLoad(e) {
+		if (e.item) {
+			this.item = JSON.parse(e.item);
+		}
+	},
+	methods: {
+		picker(e, tag) {
+			if (tag == 'joinDate' || tag == 'birthday') {
+				this.item[tag] = e.detail.value;
+			} else {
+				this.item[tag] = this.dict[tag][e.detail.value];
+			}
+			this.$forceUpdate();
+		},
+		save() {
+			let rule = [
+				{ name: 'avatar', checkType: 'notnull', errorMsg: '请上传头像' },
+				{ name: 'name', checkType: 'notnull', errorMsg: '请输入姓名' },
+				{ name: 'sex', checkType: 'notnull', errorMsg: '请上选择性别' },
+				{ name: 'birthday', checkType: 'notnull', errorMsg: '请选择出生年月' },
+				{ name: 'qualification', checkType: 'notnull', errorMsg: '请选择最高学历' },
+				{ name: 'joinDate', checkType: 'notnull', errorMsg: '请选择参加工作时间' },
+				{ name: 'phone', checkType: 'phone', errorMsg: '请输入正确的手机号' },
+				{ name: 'email', checkType: 'email', errorMsg: '请输入正确的邮箱' }
+			];
+			if (!this.verify.check(this.item, rule)) {
+				uni.showModal({ content: this.verify.error, showCancel: false });
+				return false;
+			}
+			this.http.request({
+				url: '/app/resume/user/base',
+				data: this.item,
+				method: 'POST',
+				success: (res) => {
+					uni.showToast({ title: '操作成功' });
+					setTimeout(() => {
+						uni.$emit('resume');
+						uni.navigateBack();
+					}, 1500);
+				}
+			});
+		}
+	}
+};
+</script>
+
+<style lang="scss"></style>

+ 193 - 0
app/pages/user/resume/index.vue

@@ -0,0 +1,193 @@
+<template>
+	<view class="resume animated fadeInDownBig">
+		<view class="message">
+			<view class="title">需要完善简历100%才能投递哦</view>
+			<view class="progress">
+				<u-line-progress :percentage="(((16 - item.emptyCount) / 16) * 100).toFixed(0)" height="25" text="完善"></u-line-progress>
+			</view>
+		</view>
+		<view class="row">
+			<!--个人信息-->
+			<view class="top" @click="go('/pages/user/resume/base?item=' + JSON.stringify(item))">
+				<view class="sm6">
+					<view class="name">
+						<text>{{ item.name ? item.name : '姓名' }}</text>
+						<text class="icon">&#xe6be;</text>
+					</view>
+					<view class="desc">
+						<text class="text" v-if="item.experience">{{ item.experience }}</text>
+						<text class="yd"></text>
+						<text class="text" v-if="item.age">{{ item.age }}岁</text>
+						<text class="yd"></text>
+						<text class="text" v-if="item.qualification">{{ item.qualification }}</text>
+					</view>
+					<view class="desc">
+						<view class="inf omit" v-if="item.phone">
+							<text class="icon">&#xe622;</text>
+							<text>{{ item.phone }}</text>
+						</view>
+						<view class="inf" v-if="item.email">
+							<text class="icon">&#xe908;</text>
+							<text>{{ item.email }}</text>
+						</view>
+					</view>
+				</view>
+				<image :src="item.avatar ? ip + item.avatar : '../../../static/ls.jpg'" mode="widthFix" class="tx" v-if="item.avatar"></image>
+			</view>
+		</view>
+		<!--个人优势-->
+		<view class="row" @click="go('/pages/user/resume/advantage?item=' + item.advantage)">
+			<view class="label">
+				<text class="title">个人优势</text>
+				<text class="icon">&#xe6be;</text>
+			</view>
+			<view class="ellip">{{ item.advantage }}</view>
+		</view>
+		<!--求职状态-->
+		<view class="row">
+			<view class="item">
+				<text class="title">求职状态</text>
+				<view class="right">
+					<picker :range="dict.state" @change="picker($event, 'state')">
+						<input placeholder="请选择求职状态" v-model="item.state" :disabled="true" style="text-align: right; padding-right: 20px" placeholder-class="pc" />
+						<view class="icon more" style="margin-top: -18px; float: right">&#xe8f2;</view>
+					</picker>
+				</view>
+			</view>
+		</view>
+		<!--求职期望-->
+		<view class="row">
+			<view class="label" @click="go('/pages/resume/user/desire?resumeId=' + item.id)">
+				<text class="title">求职期望</text>
+				<text class="icon">&#xe7c4;</text>
+			</view>
+			<view class="con" v-for="(item, index) in item.desireList" :key="index" @click="go('/pages/resume/user/desire?item=' + JSON.stringify(item))">
+				<view class="tit">
+					<view class="left" style="width: 70%">
+						<text>{{ item.positionName }}</text>
+						<text class="salary">{{ item.salary }}</text>
+					</view>
+					<view class="right"><text class="icon">&#xe8f2;</text></view>
+				</view>
+				<view class="desc">{{ item.cityName }}</view>
+			</view>
+		</view>
+		<!--工作经历-->
+		<view class="row">
+			<view class="label" @click="go('/pages/resume/user/work')">
+				<text class="title">工作经历</text>
+				<text class="icon">&#xe7c4;</text>
+			</view>
+			<view class="con" v-for="(item, index) in item.workList" :key="index" @click="go('/pages/resume/user/work?item=' + JSON.stringify(item))" style="margin-bottom: 15px">
+				<view class="tit">
+					<view class="left">{{ item.companyName }}</view>
+					<view class="right">
+						<text class="date">{{ item.startDate }}-{{ item.endDate }}</text>
+						<text class="icon">&#xe8f2;</text>
+					</view>
+				</view>
+				<view class="desc">
+					<text class="bf">{{ item.positionName }}</text>
+				</view>
+				<view class="ellip">内容: {{ item.job }}</view>
+			</view>
+		</view>
+		<!--项目经历-->
+		<view class="row">
+			<view class="label" @click="go('/pages/resume/user/project')">
+				<text class="title">项目经历</text>
+				<text class="icon">&#xe7c4;</text>
+			</view>
+			<view class="con" v-for="(item, index) in item.projectList" :key="index" @click="go('/pages/resume/user/project?item=' + JSON.stringify(item))">
+				<view class="tit">
+					<view class="left">{{ item.projectName }}</view>
+					<view class="right">
+						<text class="date">{{ item.startDate }}-{{ item.endDate }}</text>
+						<text class="icon">&#xe8f2;</text>
+					</view>
+				</view>
+				<view class="desc">
+					<text class="bf">{{ item.role }}</text>
+				</view>
+				<view class="ellip">内容: {{ item.projectDescribe }}</view>
+			</view>
+		</view>
+		<!--教育经历-->
+		<view class="row">
+			<view class="label" @click="go('/pages/resume/user/education')">
+				<text class="title">教育经历</text>
+				<text class="icon">&#xe7c4;</text>
+			</view>
+			<view class="con" v-for="(item, index) in item.educationList" :key="index" @click="go('/pages/resume/user/education?item=' + JSON.stringify(item))">
+				<view class="tit">
+					<view class="left">{{ item.schoolName }}</view>
+					<view class="right">
+						<text class="date">{{ item.time }}</text>
+						<text class="icon">&#xe8f2;</text>
+					</view>
+				</view>
+				<view class="desc">
+					<text class="bf">{{ item.speciality }}</text>
+					<text class="bf">{{ item.education }}</text>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			ip: this.http.ip,
+			item: { desireList: [], workList: [], projectList: [], educationList: [] },
+			dict: {
+				state: this.util.getData('state')
+			}
+		};
+	},
+	onLoad() {
+		uni.$on('resume', (res) => {
+			this.getData();
+		});
+		this.getData();
+	},
+	methods: {
+		getData() {
+			this.http.request({
+				url: '/app/resume/user/index',
+				success: (res) => {
+					this.item = res.data.data;
+					console.log(this.item);
+				}
+			});
+		},
+		picker(e, tag) {
+			this.http.request({
+				url: '/app/resume/state',
+				data: { state: this.dict[tag][e.detail.value] },
+				success: (res) => {
+					uni.showToast({ title: '操作成功' });
+					this.item[tag] = this.dict[tag][e.detail.value];
+					this.getData();
+					this.$forceUpdate();
+				}
+			});
+		},
+		go(url) {
+			uni.navigateTo({ url: url });
+		}
+	},
+	destroyed() {
+		uni.$off('resume');
+	}
+};
+</script>
+
+<style lang="scss">
+.message {
+	.progress {
+		margin-top: 7px;
+	}
+}
+</style>

+ 78 - 0
app/pages/user/switch.vue

@@ -0,0 +1,78 @@
+<template>
+	<view>
+		<view class="top">
+			<view class="int">
+				<image src="https://chenglantimes.com/prod-api/profile/upload/2024/06/04/1717472740192.jpg" mode="widthFix"></image>
+				<button class="btn" @click="go(0)">我要找工作</button>
+			</view>
+		</view>
+		<view class="middle">
+			<view class="int"><u-divider text="或者"></u-divider></view>
+		</view>
+		<view class="top" style="top: 55%">
+			<view class="int">
+				<image src="https://chenglantimes.com/prod-api/profile/upload/2024/06/04/1717472782145.jpg" mode="widthFix"></image>
+				<button class="btn" @click="go(1)">我要招人</button>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				wxUserInfo: {},
+				wx: 'false'
+			};
+		},
+		onLoad(data) {
+			if (data.wxUserInfo) {
+				this.wxUserInfo = data.wxUserInfo
+			}
+			if (data.wx) {
+				this.wx = data.wx
+			}
+		},
+		methods: {
+			//注册
+			go(type) {
+				this.http.request({
+					url: '/app/user/choice',
+					data: { type: type },
+					method: 'POST',
+					success: res => {
+						uni.navigateBack();
+					}
+				});
+			}
+		}
+	};
+</script>
+
+<style lang="scss">
+	.top {
+		position: fixed;
+		width: 100%;
+		height: 45%;
+		top: 7%;
+	}
+	.middle {
+		position: fixed;
+		width: 100%;
+		height: 10%;
+		top: 45%;
+	}
+	image {
+		width: 75%;
+		border-radius: 60%;
+	}
+	.int {
+		padding: 10px 70px 10px 70px;
+		overflow: hidden;
+		text-align: center;
+	}
+	.btn {
+		margin-top: 25px;
+	}
+</style>

+ 34 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/api/Api_NewsController.java

@@ -0,0 +1,34 @@
+package com.ruoyi.web.work.api;
+
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.web.work.domain.News;
+import com.ruoyi.web.work.service.INewsService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 企业管理
+ *
+ * @author lsw
+ * @date 2024-04-16
+ */
+@RestController
+@RequestMapping("/app/news")
+public class Api_NewsController extends BaseController {
+
+    @Autowired
+    private INewsService newsService;
+
+    @GetMapping("/list")
+    public TableDataInfo list(News news) {
+        news.setState(0);
+        startPage();
+        List<News> list = newsService.selectList(news);
+        return getDataTable(list);
+    }
+}

+ 40 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/api/Api_ResumeController.java

@@ -0,0 +1,40 @@
+package com.ruoyi.web.work.api;
+
+import com.ruoyi.common.annotation.RepeatSubmit;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.web.work.api.config.BaseController;
+import com.ruoyi.web.work.domain.dto.ResumeAdvantageDto;
+import com.ruoyi.web.work.domain.dto.ResumeBaseDto;
+import com.ruoyi.web.work.service.IResumeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 简历主
+ *
+ * @author lsw
+ * @date 2024-06-04
+ */
+@RestController
+@RequestMapping("/app/resume")
+public class Api_ResumeController extends BaseController {
+    @Autowired
+    private IResumeService resumeService;
+
+    @GetMapping("/user/index")
+    public AjaxResult userIndex() {
+        return resumeService.userIndex();
+    }
+
+    @PostMapping("/user/base")
+    public AjaxResult userBase(@Validated @RequestBody ResumeBaseDto dto) {
+        return resumeService.userBase(dto);
+    }
+
+    @PostMapping("/user/advantage")
+    public AjaxResult userAdvantage(@Validated @RequestBody ResumeAdvantageDto dto) {
+        return resumeService.userAdvantage(dto);
+    }
+
+}

+ 6 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/api/Api_UserController.java

@@ -3,6 +3,7 @@ package com.ruoyi.web.work.api;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.web.work.api.config.BaseController;
 import com.ruoyi.web.work.domain.dto.AuthDto;
+import com.ruoyi.web.work.domain.dto.ChoiceDto;
 import com.ruoyi.web.work.domain.dto.LoginDto;
 import com.ruoyi.web.work.domain.dto.UserDto;
 import com.ruoyi.web.work.service.IUserService;
@@ -42,5 +43,10 @@ public class Api_UserController extends BaseController {
         return AjaxResult.success(userService.getById(getUser().getId()));
     }
 
+    @PostMapping("/choice")
+    public AjaxResult choice(@Validated @RequestBody ChoiceDto dto) {
+         return userService.choice(dto);
+    }
+
 }
 

+ 1 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/api/config/InterceptorConfig.java

@@ -23,6 +23,7 @@ public class InterceptorConfig implements WebMvcConfigurer {
         registration.excludePathPatterns("/app/user/login"); //排除
         registration.excludePathPatterns("/app/home/**"); //排除
         registration.excludePathPatterns("/app/notice/**"); //排除
+        registration.excludePathPatterns("/app/news/**"); //排除
     }
 
     @Override

+ 12 - 8
ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/Company.java

@@ -11,6 +11,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.experimental.Accessors;
 
+import javax.validation.constraints.Email;
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.Pattern;
 import java.math.BigDecimal;
@@ -39,6 +40,9 @@ public class Company extends BaseData {
     private String director;
 
     @ApiModelProperty(value = "邮箱")
+    @NotBlank(message = "邮箱不能为空")
+    @Email(message = "邮箱格式不对")
+    @Excel(name = "邮箱", width = 27)
     private String email;
 
     @NotBlank(message = "手机号不能为空")
@@ -47,19 +51,14 @@ public class Company extends BaseData {
     @Excel(name = "手机号")
     private String phone;
 
-    @NotBlank(message = "联系地址不能为空")
-    @ApiModelProperty(value = "联系地址")
-    @Excel(name = "联系地址",width = 40)
-    private String address;
-
     @NotBlank(message = "开户行不能为空")
     @ApiModelProperty(value = "开户行")
-    @Excel(name = "开户行")
+    @Excel(name = "开户行",width = 42)
     private String bankName;
 
     @NotBlank(message = "对公账号不能为空")
     @ApiModelProperty(value = "对公账号")
-    @Excel(name = "对公账号")
+    @Excel(name = "对公账号",width = 26)
     private String bankAccount;
 
     @ApiModelProperty(value = "余额")
@@ -78,12 +77,17 @@ public class Company extends BaseData {
     @Excel(name = "账户状态", readConverterExp = "0=正常,1=停用")
     private Integer state;
 
+    @NotBlank(message = "联系地址不能为空")
+    @ApiModelProperty(value = "联系地址")
+    @Excel(name = "联系地址",width = 50)
+    private String address;
+
     @TableField(fill = FieldFill.INSERT)
     private String createBy;
 
     @TableField(fill = FieldFill.INSERT)
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @Excel(name = "创建时间", dateFormat = "yyyy-MM-dd HH:mm:ss", width = 30)
+    @Excel(name = "创建时间", dateFormat = "yyyy-MM-dd HH:mm:ss", width = 26)
     private Date createTime;
 
     @TableField(fill = FieldFill.UPDATE)

+ 83 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/Resume.java

@@ -0,0 +1,83 @@
+package com.ruoyi.web.work.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.Date;
+/**
+ * @author lsw
+ * @date 2024-06-04
+ */
+@Data
+@TableName(value = "tb_resume")
+@Accessors(chain = true)
+public class Resume{
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.INPUT)
+    private Long id;
+
+    @ApiModelProperty(value = "姓名")
+    private String name;
+
+    @ApiModelProperty(value = "头像")
+    private String avatar;
+
+    @ApiModelProperty(value = "性别")
+    private String sex;
+
+    @ApiModelProperty(value = "年龄:根=据出生年月自动计算")
+    private Integer age;
+
+    @ApiModelProperty(value = "学历:根=据教育经历自动计算")
+    private String qualification;
+
+    @ApiModelProperty(value = "工作经验:根=据参与工作时间自动计算")
+    private String experience;
+
+    @ApiModelProperty(value = "参与工作时间")
+    private String joinDate;
+
+    @ApiModelProperty(value = "手机号")
+    private String phone;
+
+    @ApiModelProperty(value = "出生年月")
+    private String birthday;
+
+    @ApiModelProperty(value = "邮箱")
+    private String email;
+
+    @ApiModelProperty(value = "个人优势")
+    private String advantage;
+
+    @ApiModelProperty(value = "求职状态")
+    private String state;
+
+    @ApiModelProperty(value = "求职期望")
+    private String desire;
+
+    @ApiModelProperty(value = "教育经历")
+    private String education;
+
+    @ApiModelProperty(value = "项目经验")
+    private String project;
+
+    @ApiModelProperty(value = "工作经验")
+    private String work;
+
+    @ApiModelProperty(value = "是否曝光简历")
+    private Integer isShow;
+
+    @TableField(fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    @TableField(fill = FieldFill.UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+
+}

+ 3 - 3
ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/User.java

@@ -63,9 +63,6 @@ public class User{
     @ApiModelProperty(value = "身份证人徽面")
     private String p2;
 
-    @ApiModelProperty(value = "服务公司")
-    private String serviceCompany;
-
     @ApiModelProperty(value = "是否认证")
     private Integer isAuthentication;
 
@@ -75,6 +72,9 @@ public class User{
     @ApiModelProperty(value = "是否签署合同:0=未签,1=已签")
     private Integer isContract;
 
+    @ApiModelProperty(value = "用户类型")
+    private Integer type;
+
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @ApiModelProperty(value = "合同有效期")
     private Date contractDate;

+ 17 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/dto/ChoiceDto.java

@@ -0,0 +1,17 @@
+package com.ruoyi.web.work.domain.dto;
+
+import lombok.Data;
+
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+
+@Data
+public class ChoiceDto {
+
+
+    @NotNull(message = "参数错误")
+    @Min(value = 0, message = "state 只能是 0 或者 1")
+    @Max(value = 1, message = "state 只能是 1 或者 0")
+    private Integer type;
+}

+ 84 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/dto/ResumeAdvantageDto.java

@@ -0,0 +1,84 @@
+package com.ruoyi.web.work.domain.dto;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.Date;
+
+/**
+ * @author lsw
+ * @date 2024-06-04
+ */
+@Data
+@TableName(value = "tb_resume")
+@Accessors(chain = true)
+public class ResumeAdvantageDto {
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.INPUT)
+    private Long id;
+
+    @ApiModelProperty(value = "姓名")
+    private String name;
+
+    @ApiModelProperty(value = "头像")
+    private String avatar;
+
+    @ApiModelProperty(value = "性别")
+    private String sex;
+
+    @ApiModelProperty(value = "年龄:根=据出生年月自动计算")
+    private Integer age;
+
+    @ApiModelProperty(value = "学历:根=据教育经历自动计算")
+    private String qualification;
+
+    @ApiModelProperty(value = "工作经验:根=据参与工作时间自动计算")
+    private String experience;
+
+    @ApiModelProperty(value = "参与工作时间")
+    private String joinDate;
+
+    @ApiModelProperty(value = "手机号")
+    private String phone;
+
+    @ApiModelProperty(value = "出生年月")
+    private String birthday;
+
+    @ApiModelProperty(value = "邮箱")
+    private String email;
+
+    @ApiModelProperty(value = "个人优势")
+    private String advantage;
+
+    @ApiModelProperty(value = "求职状态")
+    private String state;
+
+    @ApiModelProperty(value = "求职期望")
+    private String desire;
+
+    @ApiModelProperty(value = "教育经历")
+    private String education;
+
+    @ApiModelProperty(value = "项目经验")
+    private String project;
+
+    @ApiModelProperty(value = "工作经验")
+    private String work;
+
+    @ApiModelProperty(value = "是否曝光简历")
+    private Integer isShow;
+
+    @TableField(fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    @TableField(fill = FieldFill.UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+
+}

+ 60 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/dto/ResumeBaseDto.java

@@ -0,0 +1,60 @@
+package com.ruoyi.web.work.domain.dto;
+
+import com.ruoyi.common.core.validate.Regexp;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.Email;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Pattern;
+
+/**
+ * @author lsw
+ * @date 2024-06-04
+ */
+@Data
+@Accessors(chain = true)
+public class ResumeBaseDto {
+
+    @NotBlank(message = "姓名不能为空")
+    @ApiModelProperty(value = "姓名")
+    private String name;
+
+    @NotBlank(message = "头像不能为空")
+    @ApiModelProperty(value = "头像")
+    private String avatar;
+
+    @NotBlank(message = "性别不能为空")
+    @ApiModelProperty(value = "性别")
+    private String sex;
+
+    @ApiModelProperty(value = "年龄:根=据出生年月自动计算")
+    private Integer age;
+
+    @NotBlank(message = "学历不能为空")
+    @ApiModelProperty(value = "学历")
+    private String qualification;
+
+    @ApiModelProperty(value = "工作经验")
+    private String experience;
+
+    @NotBlank(message = "参与工作时间不能为空")
+    @ApiModelProperty(value = "参与工作时间")
+    private String joinDate;
+
+    @NotBlank(message = "手机号不能为空")
+    @Pattern(regexp = Regexp.PHONE, message = "手机号不合法")
+    @ApiModelProperty(value = "手机号")
+    private String phone;
+
+    @NotBlank(message = "出生年月不能为空")
+    @ApiModelProperty(value = "出生年月")
+    private String birthday;
+
+    @NotBlank(message = "邮箱不能为空")
+    @Email(message = "邮箱格式不对")
+    @ApiModelProperty(value = "邮箱")
+    private String email;
+
+}

+ 13 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/mapper/ResumeMapper.java

@@ -0,0 +1,13 @@
+package com.ruoyi.web.work.mapper;
+
+import java.util.List;
+import com.ruoyi.web.work.domain.Resume;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @author lsw
+ * @date 2024-06-04
+ */
+public interface ResumeMapper extends BaseMapper<Resume> {
+    List<Resume> selectList(Resume resume);
+}

+ 26 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/service/IResumeService.java

@@ -0,0 +1,26 @@
+package com.ruoyi.web.work.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.web.work.domain.Resume;
+import com.ruoyi.web.work.domain.dto.ResumeBaseDto;
+
+import java.util.List;
+
+/**
+ * @author lsw
+ * @date 2024-06-04
+ */
+public interface IResumeService extends IService<Resume> {
+    List<Resume> selectList(Resume resume);
+
+    AjaxResult index();
+
+    /**
+     * 编辑个人基本信息
+     *
+     * @param dto
+     * @return
+     */
+    AjaxResult base(ResumeBaseDto dto);
+}

+ 3 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/service/IUserService.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.web.work.domain.User;
 import com.ruoyi.web.work.domain.dto.AuthDto;
+import com.ruoyi.web.work.domain.dto.ChoiceDto;
 import com.ruoyi.web.work.domain.dto.LoginDto;
 import com.ruoyi.web.work.domain.dto.UserDto;
 
@@ -21,4 +22,6 @@ public interface IUserService extends IService<User>{
     AjaxResult auth(AuthDto dto);
 
     AjaxResult edit(UserDto dto);
+
+    AjaxResult choice(ChoiceDto dto);
 }

+ 60 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/service/impl/ResumeServiceImpl.java

@@ -0,0 +1,60 @@
+package com.ruoyi.web.work.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.bean.BeanUtils;
+import com.ruoyi.web.work.api.util.AppUtil;
+import com.ruoyi.web.work.domain.Resume;
+import com.ruoyi.web.work.domain.dto.ResumeBaseDto;
+import com.ruoyi.web.work.mapper.ResumeMapper;
+import com.ruoyi.web.work.service.IResumeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author lsw
+ * @date 2024-06-04
+ */
+@Service
+public class ResumeServiceImpl extends ServiceImpl<ResumeMapper, Resume> implements IResumeService {
+    @Autowired
+    private ResumeMapper resumeMapper;
+
+    @Override
+    public List<Resume> selectList(Resume resume) {
+        return resumeMapper.selectList(resume);
+    }
+
+    @Override
+    public AjaxResult index() {
+        Resume resume = getById(AppUtil.getUser().getId());
+        if (resume == null) {
+            resume = new Resume();
+            resume.setId(AppUtil.getUser().getId());
+            if (!save(resume)) {
+                throw new ServiceException("创建简历失败");
+            }
+        }
+        return AjaxResult.success(resume);
+    }
+
+    @Override
+    public AjaxResult base(ResumeBaseDto dto) {
+        Resume resume = new Resume();
+        BeanUtils.copyProperties(dto, resume);
+        resume.setId(AppUtil.getUser().getId());
+        //计算年龄
+        resume.setAge(Integer.parseInt(DateUtils.getYear()) - Integer.parseInt(resume.getBirthday().substring(0, 4)));
+        //计算工作经验
+        int year = Integer.parseInt(DateUtils.getYear()) - Integer.parseInt(resume.getJoinDate().substring(0, 4));
+        resume.setExperience(year == 0 ? "1年以内" : year + "年经验");
+        if (!updateById(resume)) {
+            throw new ServiceException("编辑简历失败");
+        }
+        return AjaxResult.success();
+    }
+}

+ 12 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/service/impl/UserServiceImpl.java

@@ -11,6 +11,7 @@ import com.ruoyi.web.work.api.config.TokenServices;
 import com.ruoyi.web.work.api.util.AppUtil;
 import com.ruoyi.web.work.domain.User;
 import com.ruoyi.web.work.domain.dto.AuthDto;
+import com.ruoyi.web.work.domain.dto.ChoiceDto;
 import com.ruoyi.web.work.domain.dto.LoginDto;
 import com.ruoyi.web.work.domain.dto.UserDto;
 import com.ruoyi.web.work.mapper.UserMapper;
@@ -93,4 +94,15 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         }
         return AjaxResult.success();
     }
+
+    @Override
+    public AjaxResult choice(ChoiceDto dto) {
+        User user = new User();
+        user.setId(AppUtil.getUser().getId());
+        user.setType(dto.getType());
+        if (!updateById(user)) {
+            throw new ServiceException("选择用户类型失败");
+        }
+        return AjaxResult.success();
+    }
 }

+ 1 - 0
ruoyi-admin/src/main/resources/mapper/work/CompanyMapper.xml

@@ -16,6 +16,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         c.phone,
         c.create_time,
         c.state,
+        c.email,
         ( SELECT COUNT( r.id ) FROM tb_relate r WHERE r.company_id = c.id ) AS peoples
         FROM
         tb_company c

+ 31 - 0
ruoyi-admin/src/main/resources/mapper/work/ResumeMapper.xml

@@ -0,0 +1,31 @@
+<?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.ResumeMapper">
+    
+    <select id="selectList" resultType="com.ruoyi.web.work.domain.Resume">
+        select * from tb_resume
+        <where>  
+            <if test="name != null  and name != ''"> and name like concat('%', #{name}, '%')</if>
+            <if test="avatar != null  and avatar != ''"> and avatar = #{avatar}</if>
+            <if test="sex != null  and sex != ''"> and sex = #{sex}</if>
+            <if test="age != null "> and age = #{age}</if>
+            <if test="qualification != null  and qualification != ''"> and qualification = #{qualification}</if>
+            <if test="experience != null  and experience != ''"> and experience = #{experience}</if>
+            <if test="joinDate != null  and joinDate != ''"> and join_date = #{joinDate}</if>
+            <if test="phone != null  and phone != ''"> and phone = #{phone}</if>
+            <if test="birthday != null  and birthday != ''"> and birthday = #{birthday}</if>
+            <if test="email != null  and email != ''"> and email = #{email}</if>
+            <if test="wx != null  and wx != ''"> and wx = #{wx}</if>
+            <if test="advantage != null  and advantage != ''"> and advantage = #{advantage}</if>
+            <if test="state != null  and state != ''"> and state = #{state}</if>
+            <if test="desire != null  and desire != ''"> and desire = #{desire}</if>
+            <if test="education != null  and education != ''"> and education = #{education}</if>
+            <if test="project != null  and project != ''"> and project = #{project}</if>
+            <if test="work != null  and work != ''"> and work = #{work}</if>
+            <if test="isShow != null "> and is_show = #{isShow}</if>
+        </where>
+    </select>
+
+</mapper>