浏览代码

完善用户简历逻辑

王育民 5 年之前
父节点
当前提交
071bbb3f89

+ 35 - 1
src/main/java/cn/minbb/job/controller/web/JobController.java

@@ -9,6 +9,7 @@ import lombok.extern.log4j.Log4j2;
 import org.springframework.data.domain.Page;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.servlet.ModelAndView;
@@ -70,7 +71,7 @@ public class JobController {
             @RequestParam(name = "page", defaultValue = "1", required = false) Integer page,
             @RequestParam(name = "size", defaultValue = "12", required = false) Integer size,
             ModelAndView modelAndView) {
-        List<Job> jobTop = jobService.findTop8();
+        List<Job> jobTop = jobService.findTop8ByType("实习");
         Page<Job> jobPage = jobService.findAllByTypeWithPage("实习", page, size);
         modelAndView.addObject("jobTop", jobTop);
         modelAndView.addObject("jobList", jobPage.getContent());
@@ -80,4 +81,37 @@ public class JobController {
         modelAndView.setViewName(Const.ViewName.VIEW_JOB_PRACTICE);
         return modelAndView;
     }
+
+    @GetMapping("/practice/{sort}")
+    public ModelAndView jobPracticeSortPage(
+            @PathVariable(required = false) Integer sort,
+            @RequestParam(name = "page", defaultValue = "1", required = false) Integer page,
+            @RequestParam(name = "size", defaultValue = "12", required = false) Integer size,
+            ModelAndView modelAndView) {
+        String name = "";
+        switch (sort) {
+            case 1:
+                name = "校园招聘";
+                break;
+            case 2:
+                name = "兼职实习";
+                break;
+            case 3:
+                name = "社会实践";
+                break;
+            case 4:
+                name = "无薪实习";
+                break;
+        }
+        List<Job> jobTop = jobService.findTop8ByTypeAndNameLike("实习", "%" + name + "%");
+        Page<Job> jobPage = jobService.findAllByTypeAndNameLikeWithPage("实习", "%" + name + "%", page, size);
+        modelAndView.addObject("name", name);
+        modelAndView.addObject("jobTop", jobTop);
+        modelAndView.addObject("jobList", jobPage.getContent());
+        modelAndView.addObject(Const.Key.KEY_PAGE, jobPage.getNumber() + 1);
+        modelAndView.addObject(Const.Key.KEY_TOTAL_PAGES, jobPage.getTotalPages());
+        modelAndView.addObject(Const.Key.KEY_ACTIVE, Const.ViewName.VIEW_JOB_PRACTICE);
+        modelAndView.setViewName(Const.ViewName.VIEW_JOB_PRACTICE);
+        return modelAndView;
+    }
 }

+ 26 - 2
src/main/java/cn/minbb/job/controller/web/UserController.java

@@ -1,6 +1,10 @@
 package cn.minbb.job.controller.web;
 
 import cn.minbb.job.data.Const;
+import cn.minbb.job.model.Resume;
+import cn.minbb.job.model.User;
+import cn.minbb.job.service.ResumeService;
+import cn.minbb.job.system.UserSession;
 import lombok.extern.log4j.Log4j2;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -12,15 +16,35 @@ import org.springframework.web.servlet.ModelAndView;
 @RequestMapping("/user")
 public class UserController {
 
+    private final ResumeService resumeService;
+
+    public UserController(ResumeService resumeService) {
+        this.resumeService = resumeService;
+    }
+
     @GetMapping("/info")
     public ModelAndView infoPage(ModelAndView modelAndView) {
-        modelAndView.setViewName(Const.ViewName.VIEW_USER_INFO);
+        User user = UserSession.getUserAuthentication();
+        if (null == user) {
+            modelAndView.setViewName(Const.ViewName.VIEW_REDIRECT);
+        } else {
+            Resume resume = resumeService.findOneByUserId(user.getId());
+            modelAndView.addObject("resume", resume);
+            modelAndView.setViewName(Const.ViewName.VIEW_USER_INFO);
+        }
         return modelAndView;
     }
 
     @GetMapping("/resume")
     public ModelAndView resumePage(ModelAndView modelAndView) {
-        modelAndView.setViewName(Const.ViewName.VIEW_USER_RESUME);
+        User user = UserSession.getUserAuthentication();
+        if (null == user) {
+            modelAndView.setViewName(Const.ViewName.VIEW_REDIRECT);
+        } else {
+            Resume resume = resumeService.findOneByUserId(user.getId());
+            modelAndView.addObject("resume", resume);
+            modelAndView.setViewName(Const.ViewName.VIEW_USER_RESUME);
+        }
         return modelAndView;
     }
 }

+ 2 - 1
src/main/java/cn/minbb/job/data/Const.java

@@ -55,10 +55,11 @@ public class Const {
         String VIEW_COMPANY = "company";
         String VIEW_COMPANIES = "companies";
         String VIEW_COMPANY_INFO = "company-info";
-        String VIEW_FEEDBACK = "feedback";
+        String VIEW_COMPANY_RESUMES = "company-resumes";
         String VIEW_USER_INFO = "user-info";
         String VIEW_USER_RESUME = "user-resume";
         String VIEW_SCHOOL_INFO = "school-info";
+        String VIEW_FEEDBACK = "feedback";
         String VIEW_ADMIN = "admin";
     }
 

+ 60 - 8
src/main/java/cn/minbb/job/model/Resume.java

@@ -6,7 +6,6 @@ import lombok.NoArgsConstructor;
 
 import javax.persistence.Column;
 import javax.persistence.Entity;
-import javax.persistence.Index;
 import javax.persistence.Table;
 
 /**
@@ -16,23 +15,76 @@ import javax.persistence.Table;
 @Entity
 @EqualsAndHashCode(callSuper = true)
 @NoArgsConstructor
-@Table(name = "resume",
-        indexes = {
-                @Index(name = "index_name", columnList = "name")
-        }
-)
+@Table(name = "resume")
 public class Resume extends Auditable {
 
+    @Column(name = "user_id", nullable = false, columnDefinition = "INT COMMENT '用户ID'")
+    private Integer userId;
+
     @Column(name = "name", nullable = false, columnDefinition = "VARCHAR(32) COMMENT '姓名'")
     private String name;
 
-    @Column(name = "photo", nullable = false, columnDefinition = "VARCHAR(255) COMMENT '照片'")
+    @Column(name = "photo", nullable = false, columnDefinition = "MEDIUMTEXT COMMENT '照片'")
     private String photo;
 
     @Column(name = "age", columnDefinition = "INT COMMENT '年龄'")
     private Integer age;
 
-    @Column(name = "description", columnDefinition = "VARCHAR(1000) COMMENT '描述'")
+    @Column(name = "job_planning", columnDefinition = "VARCHAR(32) COMMENT '职业规划'")
+    private String jobPlanning;
+
+    @Column(name = "phone", columnDefinition = "VARCHAR(32) COMMENT '手机号码'")
+    private String phone;
+
+    @Column(name = "mail", columnDefinition = "VARCHAR(64) COMMENT '电子邮箱'")
+    private String mail;
+
+    @Column(name = "website", columnDefinition = "VARCHAR(64) COMMENT '网站'")
+    private String website;
+
+    @Column(name = "home", columnDefinition = "VARCHAR(32) COMMENT '家乡'")
+    private String home;
+
+    @Column(name = "signature", columnDefinition = "VARCHAR(255) COMMENT '签名'")
+    private String signature;
+
+    @Column(name = "place", columnDefinition = "VARCHAR(32) COMMENT '当前所在地'")
+    private String place;
+
+    @Column(name = "edu_time", columnDefinition = "VARCHAR(64) COMMENT '最高学历时间'")
+    private String eduTime;
+
+    @Column(name = "edu_school", columnDefinition = "VARCHAR(64) COMMENT '最高学历学校'")
+    private String eduSchool;
+
+    @Column(name = "edu_profession", columnDefinition = "VARCHAR(64) COMMENT '学习专业'")
+    private String eduProfession;
+
+    @Column(name = "work_time", columnDefinition = "VARCHAR(64) COMMENT '工作时间'")
+    private String workTime;
+
+    @Column(name = "work_company", columnDefinition = "VARCHAR(64) COMMENT '工作公司'")
+    private String workCompany;
+
+    @Column(name = "work_position", columnDefinition = "VARCHAR(64) COMMENT '职位'")
+    private String workPosition;
+
+    @Column(name = "work_description", columnDefinition = "TEXT COMMENT '工作描述'")
+    private String workDescription;
+
+    @Column(name = "work_gain", columnDefinition = "TEXT COMMENT '工作收获'")
+    private String workGain;
+
+    @Column(name = "skill", columnDefinition = "TEXT COMMENT '专业技能'")
+    private String skill;
+
+    @Column(name = "project", columnDefinition = "TEXT COMMENT '项目经历'")
+    private String project;
+
+    @Column(name = "hobby", columnDefinition = "TEXT COMMENT '兴趣爱好'")
+    private String hobby;
+
+    @Column(name = "description", columnDefinition = "TEXT COMMENT '描述'")
     private String description;
 
     @Column(name = "is_enabled", nullable = false, columnDefinition = "TINYINT DEFAULT '1' COMMENT '启用'")

+ 8 - 0
src/main/java/cn/minbb/job/model/repository/JobRepository.java

@@ -1,6 +1,8 @@
 package cn.minbb.job.model.repository;
 
 import cn.minbb.job.model.Job;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaRepository;
 
 import java.util.List;
@@ -9,4 +11,10 @@ public interface JobRepository extends JpaRepository<Job, Integer> {
     List<Job> findTop8ByIsEnabledTrueOrderByPriorityDesc();
 
     List<Job> findTop5ByTypeAndIsEnabledTrueOrderByPriorityDesc(String type);
+
+    List<Job> findTop8ByTypeAndIsEnabledTrueOrderByPriorityDesc(String type);
+
+    List<Job> findTop8ByTypeAndNameLikeAndIsEnabledTrueOrderByPriorityDesc(String type, String name);
+
+    Page<Job> findAllByTypeAndNameLikeAndIsEnabledTrue(String type, String name, Pageable pageable);
 }

+ 6 - 0
src/main/java/cn/minbb/job/service/JobService.java

@@ -15,7 +15,13 @@ public interface JobService {
 
     List<Job> findTop5ByType(String type);
 
+    List<Job> findTop8ByType(String type);
+
+    List<Job> findTop8ByTypeAndNameLike(String type, String name);
+
     List<Job> findAllByCompanyAndType(Company company, String type);
 
     Page<Job> findAllByTypeWithPage(String type, Integer page, Integer size);
+
+    Page<Job> findAllByTypeAndNameLikeWithPage(String type, String name, Integer page, Integer size);
 }

+ 3 - 0
src/main/java/cn/minbb/job/service/ResumeService.java

@@ -1,4 +1,7 @@
 package cn.minbb.job.service;
 
+import cn.minbb.job.model.Resume;
+
 public interface ResumeService {
+    Resume findOneByUserId(Integer userId);
 }

+ 15 - 0
src/main/java/cn/minbb/job/service/impl/JobServiceImpl.java

@@ -41,6 +41,16 @@ public class JobServiceImpl implements JobService {
         return jobRepository.findTop5ByTypeAndIsEnabledTrueOrderByPriorityDesc(type);
     }
 
+    @Override
+    public List<Job> findTop8ByType(String type) {
+        return jobRepository.findTop8ByTypeAndIsEnabledTrueOrderByPriorityDesc(type);
+    }
+
+    @Override
+    public List<Job> findTop8ByTypeAndNameLike(String type, String name) {
+        return jobRepository.findTop8ByTypeAndNameLikeAndIsEnabledTrueOrderByPriorityDesc(type, name);
+    }
+
     @Override
     public List<Job> findAllByCompanyAndType(Company company, String type) {
         Job job = new Job();
@@ -57,4 +67,9 @@ public class JobServiceImpl implements JobService {
         job.setIsEnabled(Boolean.TRUE);
         return jobRepository.findAll(Example.of(job), PageHelper.of(page, size, SortTool.priorityDown()));
     }
+
+    @Override
+    public Page<Job> findAllByTypeAndNameLikeWithPage(String type, String name, Integer page, Integer size) {
+        return jobRepository.findAllByTypeAndNameLikeAndIsEnabledTrue(type, name, PageHelper.of(page, size, SortTool.priorityDown()));
+    }
 }

+ 13 - 0
src/main/java/cn/minbb/job/service/impl/ResumeServiceImpl.java

@@ -1,9 +1,13 @@
 package cn.minbb.job.service.impl;
 
+import cn.minbb.job.model.Resume;
 import cn.minbb.job.model.repository.ResumeRepository;
 import cn.minbb.job.service.ResumeService;
+import org.springframework.data.domain.Example;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 @Service
 public class ResumeServiceImpl implements ResumeService {
 
@@ -12,4 +16,13 @@ public class ResumeServiceImpl implements ResumeService {
     public ResumeServiceImpl(ResumeRepository resumeRepository) {
         this.resumeRepository = resumeRepository;
     }
+
+    @Override
+    public Resume findOneByUserId(Integer userId) {
+        Resume resume = new Resume();
+        resume.setUserId(userId);
+        resume.setIsEnabled(Boolean.TRUE);
+        List<Resume> resumeList = resumeRepository.findAll(Example.of(resume));
+        return resumeList.isEmpty() ? null : resumeList.get(0);
+    }
 }

+ 19 - 0
src/main/resources/templates/company-resumes.html

@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html lang="zh-CN" xmlns="http://www.w3.org/1999/html"
+      xmlns:th="http://www.thymeleaf.org"
+      xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+      layout:decorate="~{layouts/layout}">
+<head>
+    <meta charset="UTF-8"/>
+    <title>全部简历 - [[${APP_NAME}]]</title>
+</head>
+<body>
+<th:block layout:fragment="content">
+    <div class="container">
+        <div class="row" style="margin-top: 24px;">
+            <div class="col"></div>
+        </div>
+    </div>
+</th:block>
+</body>
+</html>

+ 1 - 0
src/main/resources/templates/company.html

@@ -102,6 +102,7 @@
         <div class="col-md-7 p-lg-5 mx-auto my-5" style="z-index: 1;">
             <h1 class="display-4 font-weight-normal" th:text="${company.getName()}"></h1>
             <p class="lead font-weight-normal" th:text="${company.getIntroduction()}"></p>
+            <p class="lead text-muted" th:if="${company.getNature() != '' && company.getScale() != ''}" th:text="${company.getNature() + ' / ' + company.getScale()}"></p>
             <a class="btn btn-outline-secondary" href="#!" th:href="${'?id=' + company.getId()}">支持我们</a>
         </div>
         <div class="product-device box-shadow d-none d-md-block"></div>

+ 3 - 3
src/main/resources/templates/index.html

@@ -143,7 +143,7 @@
                                 <strong class="text-gray-dark" th:text="${job.getName()}"></strong>
                                 <a href="#" target="_blank" th:href="${'/job?id=' + job.getId()}">查看</a>
                             </div>
-                            <span class="d-block" th:text="${#strings.abbreviate(job.getDescription(), 20)}"></span>
+                            <span class="d-block" th:text="${#strings.abbreviate(job.getDescription(), 48)}"></span>
                         </div>
                     </div>
                     <small class="d-block text-right mt-3">
@@ -153,14 +153,14 @@
 
                 <div class="my-3 p-3 bg-white rounded box-shadow">
                     <h5 class="border-bottom border-gray pb-2 mb-0">实习招聘</h5>
-                    <div class="media text-muted pt-3" th:each="job : ${jobTop1}">
+                    <div class="media text-muted pt-3" th:each="job : ${jobTop2}">
                         <img class="mr-2 rounded" alt="" src="" style="width: 32px; height: 32px;" th:src="${job.getCompany().getBrand()}"/>
                         <div class="media-body pb-3 mb-0 small lh-125 border-bottom border-gray">
                             <div class="d-flex justify-content-between align-items-center w-100">
                                 <strong class="text-gray-dark" th:text="${job.getName()}"></strong>
                                 <a href="#" target="_blank" th:href="${'/job?id=' + job.getId()}">查看</a>
                             </div>
-                            <span class="d-block" th:text="${#strings.abbreviate(job.getDescription(), 20)}"></span>
+                            <span class="d-block" th:text="${#strings.abbreviate(job.getDescription(), 48)}"></span>
                         </div>
                     </div>
                     <small class="d-block text-right mt-3">

+ 6 - 6
src/main/resources/templates/job-practice.html

@@ -18,10 +18,10 @@
     <div class="container">
         <div class="nav-scroller py-1 mb-2" style="margin-bottom: 0!important;">
             <nav class="nav d-flex">
-                <a class="p-2 text-muted" href="#">校园招聘</a>
-                <a class="p-2 text-muted" href="#">兼职实习</a>
-                <a class="p-2 text-muted" href="#">社会实践</a>
-                <a class="p-2 text-muted" href="#">无薪实习</a>
+                <a class="p-2 text-muted" href="/job/practice/1">校园招聘</a>
+                <a class="p-2 text-muted" href="/job/practice/2">兼职实习</a>
+                <a class="p-2 text-muted" href="/job/practice/3">社会实践</a>
+                <a class="p-2 text-muted" href="/job/practice/4">无薪实习</a>
             </nav>
         </div>
     </div>
@@ -31,10 +31,10 @@
 
         <div class="row">
             <div class="col-md-8">
-                <h3 class="pb-3 mb-4 font-italic border-bottom">校园招聘</h3>
+                <h3 class="pb-3 mb-4 font-italic border-bottom">实习招聘</h3>
 
                 <div class="my-3 p-3 bg-white rounded box-shadow">
-                    <h5 class="border-bottom border-gray pb-2 mb-0">全职招聘</h5>
+                    <h5 class="border-bottom border-gray pb-2 mb-0" th:text="${name == '' ? '全部职位' : name}"></h5>
                     <div class="media text-muted pt-3" th:each="job : ${jobList}">
                         <img class="mr-2 rounded" alt="" src="" style="width: 32px; height: 32px;" th:src="${job.getCompany().getBrand()}"/>
                         <div class="media-body pb-3 mb-0 small lh-125 border-bottom border-gray">

文件差异内容过多而无法显示
+ 4 - 0
src/main/resources/templates/user-info.html


+ 264 - 9
src/main/resources/templates/user-resume.html

@@ -1,19 +1,274 @@
 <!DOCTYPE html>
 <html lang="zh-CN" xmlns="http://www.w3.org/1999/html"
-      xmlns:th="http://www.thymeleaf.org"
-      xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
-      layout:decorate="~{layouts/layout}">
+      xmlns:th="http://www.thymeleaf.org">
 <head>
+    <title>王育民 - 简历</title>
     <meta charset="UTF-8"/>
-    <title>全部简历 - [[${APP_NAME}]]</title>
+    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
+    <meta name="viewport" content="width=device-width, initial-scale=1"/>
+    <!-- Favicon -->
+    <link href="https://files.minbb.cn/sso/favicon.ico" rel="icon" type="image/x-icon"/>
+    <link href="https://files.minbb.cn/css/materialize/1.0.0-rc.1/materialize.min.css" rel="stylesheet"/>
+    <link href="https://cdn.bootcss.com/font-awesome/5.12.1/css/all.css" rel="stylesheet"/>
+
+    <style>
+        ::selection {
+            background: rgba(139, 195, 74, 0.8);
+        }
+
+        ::-moz-selection {
+            background: rgba(139, 195, 74, 0.8);
+        }
+
+        .project span {
+            display: block;
+            text-indent: 2em;
+        }
+
+        .content .col .row {
+            margin-bottom: -20px;
+        }
+
+        /* label color */
+        .input-field label {
+            color: #ff6767;
+        }
+
+        /* label focus color */
+        .input-field input[type=text]:focus + label {
+            color: #ffe858;
+        }
+
+        /* label underline focus color */
+        .input-field input[type=text]:focus {
+            border-bottom: 1px solid purple;
+            box-shadow: 0 1px 0 0 purple;
+        }
+
+        /* valid color */
+        .input-field input[type=text].valid {
+            border-bottom: 1px solid #44dd3c;
+            box-shadow: 0 1px 0 0 #44dd3c;
+        }
+
+        /* invalid color */
+        .input-field input[type=text].invalid, textarea.invalid {
+            border-bottom: 1px solid red;
+            box-shadow: 0 1px 0 0 red;
+        }
+
+        /* icon prefix focus color */
+        .input-field .prefix.active {
+            color: #5573dd;
+        }
+    </style>
 </head>
 <body>
-<th:block layout:fragment="content">
-    <div class="container">
-        <div class="row" style="margin-top: 24px;">
-            <div class="col"></div>
+<div class="content">
+    <div class="row white-text">
+        <div class="col s12 m4 l3">
+            <div class="card-panel blue darken-3 center-align">
+                <img class="materialboxed" src="https://my-1252373323.cos.ap-beijing.myqcloud.com/images/my/my-1in.jpg" width="128" alt="王育民"
+                     data-caption="王育民" style="border: 3px solid white; margin: 0 auto;" th:src="${resume.getPhoto()}"/>
+                <h3 style="font-family: 黑体;" th:text="${resume.getName()}">王育民</h3>
+                <h6>职业规划</h6>
+                <h6 th:text="${resume.getJobPlanning()}">Android 开发工程师</h6>
+                <br/>
+                <table class="highlight centered" style="width: 70%; margin: 0 auto; border-collapse: separate; border-spacing: 0 0;">
+                    <tbody>
+                    <tr>
+                        <td class="center-align"><i class="fa fa-user"></i></td>
+                        <td th:text="${resume.getName()}">王育民</td>
+                    </tr>
+                    <tr>
+                        <td class="center-align"><i class="fa fa-phone-alt"></i></td>
+                        <td><a href="tel:18838936922" style="color: white;" th:text="${resume.getPhone()}">18838936922</a></td>
+                    </tr>
+                    <tr>
+                        <td class="center-align"><i class="fa fa-envelope"></i></td>
+                        <td>
+                            <a href="mailto:yumin@minbb.cn?CC=yumin@minbb.cn&BCC=yumin@minbb.cn&Subject=Hello, 王育民&Body="
+                               style="color: white;" target="_self" th:text="${resume.getMail()}">yumin@minbb.cn</a>
+                        </td>
+                    </tr>
+                    <tr>
+                        <td class="center-align"><i class="fa fa-link"></i></td>
+                        <td><a href="https://www.minbb.cn/" style="color: white;" th:text="${resume.getWebsite()}">www.minbb.cn</a></td>
+                    </tr>
+                    <tr>
+                        <td class="center-align"><i class="fa fa-home"></i></td>
+                        <td th:text="${resume.getHome()}">河南 · 南阳</td>
+                    </tr>
+                    </tbody>
+                </table>
+            </div>
+
+            <div class="row">
+                <div class="col s12 m12">
+                    <div class="card red accent-3">
+                        <div class="card-content white-text">
+                            <span class="card-title">签名</span>
+                            <p style="text-indent: 2em;" th:text="${resume.getSignature()}">
+                                计算机科学与技术专业(互联网方向)。从事计算机软件开发行业,就职于南京亚信软件有限公司,主要工作为后端开发与 Android 开发。
+                            </p>
+                        </div>
+                        <div class="card-action"><i class="fa fa-map-marker-alt"></i> [[${resume.getPlace()}]]</div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row"></div>
+        </div>
+
+        <div class="col s12 m8 l9">
+            <div class="row">
+                <div class="col s12 m12">
+                    <div class="card-panel blue darken-3">
+                        <div class="">
+                            <h6><b>教育背景</b></h6>
+                            <table style="border-collapse: separate;">
+                                <tbody>
+                                <tr>
+                                    <td th:text="${resume.getEduTime()}">2015.09 - 2019.06</td>
+                                    <td th:text="${resume.getEduSchool()}">郑州轻工业大学</td>
+                                    <td th:text="${resume.getEduProfession()}">计算机科学与技术(互联网科学与技术)</td>
+                                </tr>
+                                </tbody>
+                            </table>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row">
+                <div class="col s12 m12">
+                    <div class="card-panel blue darken-3">
+                        <div class="">
+                            <h6><b>工作经历</b></h6>
+                            <table>
+                                <tbody>
+                                <tr>
+                                    <td th:text="${resume.getWorkTime()}">2018.12 - 至今</td>
+                                    <td th:text="${resume.getWorkCompany()}">南京亚信软件有限公司</td>
+                                    <td th:text="${resume.getWorkPosition()}">后端开发工程师</td>
+                                </tr>
+                                </tbody>
+                            </table>
+                            <h6><b>工作描述</b></h6>
+                            <ul>
+                                <li th:text="${resume.getWorkDescription()}">
+                                    <i class="fa fa-caret-right"></i>
+                                    移动事业部 解决方案中心二部 中移在线项目组 后端开发
+                                </li>
+                            </ul>
+                            <h6><b>收获</b></h6>
+                            <p style="text-indent: 2em;" th:text="${resume.getWorkGain()}">
+                                在创新创业工作室的时间里,通过对计算机专业知识系统化的学习及应用,掌握了许多专业知识,拥有了独立开发计算机软件的能力,同时学会了许多与他人团结协作以及沟通的能力;
+                                在为易达电子科技负责软件开发工作,不仅仅通过给客户开发行业定制类软件获得了一定的酬劳,同样学到了更多的专业知识,强化了专业知识在实际生活中的应用能力;
+                                在亚信实习和正式工作期间,让我真正的接触到了大企业文化,逐步完成了职业化角色的转变,发现了自己真实的潜力,为自我成长丰富了阅历。
+                                并且逐渐熟悉了软件工程行业在电信互联网行业的应用场景和价值,积累了更多更深的技术栈,同时也提高了自己的开发能力、沟通能力和业务处理能力。
+                            </p>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row">
+                <div class="col s12 m12">
+                    <div class="card-panel blue darken-3">
+                        <div class="">
+                            <h6><b>专业技能</b></h6>
+                            <ul>
+                                <li>
+                                    <i class="fa fa-caret-right"></i>
+                                    熟练使用 Office 办公软件和 Photoshop
+                                </li>
+                                <li>
+                                    <i class="fa fa-caret-right"></i>
+                                    熟练掌握 Java, HTML5, CSS3, JavaScript, C# 等软件开发语言
+                                </li>
+                                <li>
+                                    <i class="fa fa-caret-right"></i>
+                                    熟练使用 Bootstrap, Materialize, Spring Boot, Spring Cloud, Hibernate, MyBatis 等主流开发框架和技术
+                                </li>
+                                <li>
+                                    <i class="fa fa-caret-right"></i>
+                                    熟练使用 SQL 语言对 MySQL 关系型数据库进行增删改查等操作
+                                </li>
+                                <li>
+                                    <i class="fa fa-caret-right"></i>
+                                    熟练使用 Android 开发技术,开发原生 Android 应用程序
+                                </li>
+                                <li>
+                                    <i class="fa fa-caret-right"></i>
+                                    熟练使用并维护 Windows Server 服务器,并且在服务器上部署 Web 服务器,FTP 服务器,正向、反向网络代理服务器,MQTT 服务器,私有网络云盘,Git 环境等
+                                </li>
+                            </ul>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row">
+                <div class="col s12 m12">
+                    <div class="card-panel blue darken-3">
+                        <div class="project">
+                            <h6><b>项目经历</b></h6>
+                            <b>获奖情况:</b><br/>
+                            <span>2016 年 4 月荣获互联网 ACM 月季赛第二名;</span>
+                            <span>2017 年 4 月荣获第八届蓝桥杯全国软件和信息技术专业人才大赛河南赛区JAVA软件开发大学B组省部级个人二等奖;</span>
+                            <span>2017 年 5 月荣获第十三届“挑战杯”河南省大学生课外学术科技作品竞赛省级二等奖;</span>
+                            <span>2017 年 11 月荣获计算机学科类单项奖学金。</span>
+                            <b>项目经历:</b><br/>
+                            <span>基于Android 在线点名 APP 的设计与实现、基于 Android 的远程数据库管理软件的设计与实现、大学生创新能力评测系统、国际教育学院设备借还系统、渔民博客/主页等。</span>
+                            <span>中移在线项目组:86君APP后端开发、公安三所送检智能门禁APP前端开发、实名认证一体机串口通信中间件开发、智慧社区后端开发。</span>
+                            <b>网站地址:</b>
+                            <a class="white light-green-text" href="https://www.minbb.cn" target="_blank">&nbsp; www.minbb.cn &nbsp;</a>
+                            <a class="white light-green-text" href="https://my.minbb.cn" target="_blank">&nbsp; my.minbb.cn &nbsp;</a>
+                            <a class="white light-green-text" href="https://blog.minbb.cn" target="_blank">&nbsp; blog.minbb.cn &nbsp;</a>
+                            <a class="white light-green-text" href="https://sso.minbb.cn" target="_blank">&nbsp; sso.minbb.cn &nbsp;</a>
+                            <a class="white light-green-text" href="https://lender.minbb.cn" target="_blank">&nbsp; lender.minbb.cn &nbsp;</a>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row">
+                <div class="col s12 m12">
+                    <div class="card-panel blue darken-3">
+                        <div class="">
+                            <h6><b>技能爱好</b></h6>
+                            <div class="project" style="text-indent: 2em;" th:text="${resume.getSkill()}">
+                                <span>在专业技能方面,我爱好与计算机相关的一切,计算机硬件、软件、网络、编写和设计程序等。</span>
+                                <span>在兴趣爱好方面,对科技类产品,物联网技术,电子电器等都非常热衷。我对计算机和互联网行业有着非常浓厚的兴趣,面对这些我会态度诚恳、积极工作,并通过我的努力,在计算机领域有所成就。</span>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row">
+                <div class="col s12 m12">
+                    <div class="card-panel blue darken-3">
+                        <div class="">
+                            <h6><b>自我描述</b></h6>
+                            <p style="text-indent: 2em;" th:text="${resume.getDescription()}">
+                                愿意且能吃苦,学习能力和接受能力强,善于团队合作,乐观向上,能积极的面对压力;做事认真细致,工作质量高。非常热爱编程,对代码规范化要求极其严格,喜欢探索,刨根问底。
+                            </p>
+                        </div>
+                    </div>
+                </div>
+            </div>
         </div>
     </div>
-</th:block>
+</div>
+
+<script src="https://files.minbb.cn/js/jquery/1.12.4/jquery.min.js"></script>
+<script src="https://files.minbb.cn/js/materialize/1.0.0-rc.1/materialize.min.js"></script>
+<script>
+    $(document).ready(function () {
+        $('.materialboxed').materialbox();
+    });
+</script>
 </body>
 </html>

部分文件因为文件数量过多而无法显示