1 项目说明

1.1 工作说明

01.常见信息
    a.环节
        文档驱动
        编译、运行、构建、部署
    b.转正前
        优先级:临时、漏洞、日常
    c.转正后
        XXXXXX

02.常见信息
    a.沟通
        描述:
        问题:
        临时解决:
        建议解决:
        沟通人:
    b.职责
        1.明确:任务
        2.确定:工期
        3.沟通:业务逻辑
        4.沟通:找XXX处理XXX的问题
        5.原则:妥协、替代、临时、商量

03.账号信息
    a.Gogs
        XXXXXX
    b.Gitlab
        XXXXXX

1.2 排查信息

00.程序位置
    a.查看pid、查看程序目录
        ps -ef | grep java                                                      --查看进程
        ------------------------------------------------------------------------
        lsof -i:9981                                                            --命令1:查找9981对应pid
        ps -ef | grep java | grep 1723891                                       --命令2:查找pid对应java
        tail -f jeecgboot-2025-02-06.0.log                                      --命令3:查看日志
        ------------------------------------------------------------------------
        ps -ef | grep $(lsof -ti:9981)                                          --组合命令
        ps -ef | grep $(lsof -ti:9981) | grep java                              --组合命令
        kill -9 [pid]
    b.curl测试
        curl --location 'http://172.17.10.201:9981/jeecg-boot/mo/isp/getIndicator' \
        --header 'Content-Type: application/json' \
        --data '{
            "indicatorDate": 202501
        }'
    c.前端日志
        tail -f /var/log/nginx/access.log                                       --访问日志
        tail -f /var/log/nginx/error.log                                        --错误日志
    d.后端日志
        cd /root/myprojects/logs/                                               --每天日志
        tail -f jeecgboot-2025-02-06.0.log                                      --实时日志ONObject dataParam = new JSONObject();
                    dataPa
    e.停止、启动
        ps -ef | grep java                                                      --查看进程
        kill [pid]                                                              --优雅停机
        ------------------------------------------------------------------------
        sh /root/hr-project/backend-start.sh start                              --启动
        tail -f /root/hr-project/hr-backend/jeecg-module-system/jeecg-system-start/logs/jeecgboot-2025-03-02.0.log  --日志

01.查看系统
    a.使用uname -a命令
        uname -a                                                                --显示系统内核版本
    b.查看发行版特定的版本文件:
        cat /etc/redhat-release                                                 --适用于RedHat/CentOS系统
        cat /etc/debian_version                                                 --适用于Debian系统
        cat /etc/ubuntu-release                                                 --适用于Ubuntu系统
    c.使用hostnamectl命令
        hostnamectl                                                             --查看主机名和其他信息(适用于systemd系统)
    d.查看性能1
        lscpu                                                                   --查看 CPU 信息
        cat /proc/cpuinfo                                                       --查看详细的 CPU 信息
        free -h                                                                 --查看内存信息
        cat /proc/meminfo                                                       --查看详细的内存信息
        ------------------------------------------------------------------------
        df -h                                                                   --查看磁盘使用情况
        top                                                                     --查看系统负载和性能
        vmstat                                                                  --查看系统的虚拟内存、进程、CPU 活动等信息
        ------------------------------------------------------------------------
        dmesg | grep -i vmware                                                  --查看是否vmware虚拟化机器
        lscpu | grep -i hypervisor                                              --查看是否vmware虚拟化机器
    e.查看性能2
        echo "=== CPU 信息 ==="
        lscpu | grep -E '^CPU\(s\):|^Model name:|^Socket\(s\):|^Thread\(s\) per core:|^Core\(s\) per socket:'
        echo -e "\n=== 内存信息 ==="
        free -h
        echo -e "\n=== 磁盘信息 ==="
        df -h --total | grep 'total'
        echo -e "\n=== 显卡信息 ==="
        lspci | grep -i --color 'vga\|3d\|2d'

02.查看ip端口
    a.netstat命令
        yum install net-tools                                                   --安装 net-tools
        netstat -tunlp | grep 9981                                              --查看具体某个端
    b.ss命令
        ss -tunlp | grep 9981                                                   --查看具体某个端
    c.lsof命令
        yum install lsof                                                        --安装 lsof
        lsof -i                                                                 --查看所有网络连接
        lsof -i:9981
    d.firewall-cmd命令
        firewall-cmd --list-ports                                               --查看所有开放的端口
        firewall-cmd --query-port=9981/tcp                                      --查询某个端口是否开放

03.防火墙
    a.systemctl
        systemctl stop firewalld                                                --关闭防火墙
        systemctl disable firewalld                                             --禁止开机自启
        systemctl status firewalld                                              --防火墙状态
        systemctl start firewalld                                               --开启防火墙
        systemctl enable firewalld                                              --开启开机自启
    b.firewall-cmd
        firewall-cmd --reload                                                   --重启防火墙
        firewall-cmd --zone=public --add-port=3306/tcp --permanent              --开放3306端口
        firewall-cmd --zone=public --remove-port=3306/tcp --permanent           --关闭3306端口
        firewall-cmd --zone=public --list-ports                                 --查看开放端口
        firewall-cmd --zone=public --query-port=3306/tcp                        --查看具体端口
        firewall-cmd --state                                                    --查看防火墙状态

04.nginx
    a.查看nginx配置文件
        cd /etc/nginx/
        ls
        cat nginx.conf
    b.查看conf.d目录下的配置
        cd /etc/nginx/conf.d/
        ls
        cat *.conf
    c.查看sites-enabled目录(如果存在)
        cd /etc/nginx/sites-enabled/
        ls
    d.检查nginx配置是否正确
        nginx -t
    e.查看nginx进程
        ps -ef | grep nginx
    f.访问日志
        tail -f /var/log/nginx/access.log
    g.错误日志
        tail -f /var/log/nginx/error.log

05.自定义DNS
    a.编辑hosts文件
        vi /etc/hosts
        # 添加格式如下:
        # IP地址      域名
        192.168.1.100   example.com
        192.168.1.101   test.com
    b.修改DNS服务器
        vi /etc/resolv.conf
        # 添加或修改nameserver
        nameserver 8.8.8.8
        nameserver 114.114.114.114
    d.刷新DNS缓存
        systemctl restart NetworkManager
        # 或
        nscd -i hosts  # 如果安装了nscd
    e.测试DNS解析
        nslookup example.com
        ping example.com
    f.查看DNS是否生效
        # 查看当前DNS服务器
        cat /etc/resolv.conf
        # 测试DNS解析
        dig @8.8.8.8 example.com

06.系统编码1
    a.linux
        [root@localhost hr-backend]# stat /etc/locale.conf
          File: /etc/locale.conf
          Size: 19              Blocks: 8          IO Block: 4096   regular file
        Device: fd00h/64768d    Inode: 67431224    Links: 1
        Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
        Access: 2025-03-08 10:50:06.920797929 +0800
        Modify: 2022-01-11 10:28:26.559915054 +0800
        Change: 2022-01-11 10:28:26.559915054 +0800
         Birth: 2022-01-11 10:28:26.558915052 +0800
        -----------------------------------------------------------------------------------------------------
        通常情况下,Java会使用操作系统的默认字符编码
        Access 字段表示文件的最后访问时间,这是指文件内容最后一次被读取的时间,而不是文件被修改或更改的时间
    b.查看编码
        $ locale
        $ cat /etc/locale.conf
        -----------------------------------------------------------------------------------------------------
        LANG=C.UTF-8      不提供特定语言的特性;用默认的、简单的格式            公司服务器,默认编码
        LANG=en_US.UTF-8  美国英语的语言特性;美国的习惯格式化日期、时间、货币   腾讯云服务器,默认编码
    c.查看系统安装的字符编码
        $ locale -a
        -----------------------------------------------------------------------------------------------------
        locale: Cannot set LC_CTYPE to default locale: No such file or directory
        locale: Cannot set LC_MESSAGES to default locale: No such file or directory
        locale: Cannot set LC_COLLATE to default locale: No such file or directory
        C
        C.utf8
        POSIX
        zh_CN
        zh_CN.gb18030
        zh_CN.gbk
        zh_CN.utf8
        zh_HK
        zh_HK.utf8
        zh_SG
        zh_SG.gbk
        zh_SG.utf8
        zh_TW
        zh_TW.euctw
        zh_TW.utf8
    d.生成编码
        # 打开 /etc/locale.gen 文件
        vi /etc/locale.gen
        # 确保文件中包含以下行(如果没有,请添加)
        C.UTF-8 UTF-8
        # 生成语言环境
        sudo locale-gen
        # 设置默认语言环境
        sudo update-locale LANG=C.UTF-8
    e.修改编码
        # 临时更改
        export LANG=C.UTF-8
        # 永久更改
        vi /etc/locale.conf
        LANG=C.UTF-8
        # 更新当前会话
        source /etc/locale.conf

07.系统编码2
    a.如果要设置中文版的字体编,在每个文件中增加以下内容
        # cat /etc/profile.d/locale.sh
        # vim /etc/profile.d/locale.sh
        export LC_CTYPE=zh_CN.UTF-8
        export LC_ALL=zh_CN.UTF-8

        # cat /etc/locale.conf
        # vim /etc/locale.conf
        LANG=zh_CN.UTF-8

        # cat /etc/sysconfig/i18n
        # vim /etc/sysconfig/i18n
        LANG=zh_CN.UTF-8

        # cat /etc/environment
        # vim /etc/environment
        LANG=zh_CN.UTF-8
        LC_ALL=zh_CN.UTF-8

        # source /etc/profile.d/locale.sh
        # source /etc/locale.conf
        # source /etc/sysconfig/i18n
        # source /etc/environment
    b.如果要设置英文版的字体编码。在每个文件中增加以下内容
        # cat /etc/profile.d/locale.sh
        # vim /etc/profile.d/locale.sh
        export LC_CTYPE=en_US.UTF-8
        export LC_ALL=en_US.UTF-8

        # cat /etc/locale.conf
        # vim /etc/locale.conf
        LANG=en_US.UTF-8

        # cat /etc/sysconfig/i18n
        # vim /etc/sysconfig/i18n
        LANG=en_US.UTF-8

        # cat /etc/environment
        # vim /etc/environment
        LANG=en_US.UTF-8
        LC_ALL=en_US.UTF-8

        # source /etc/profile.d/locale.sh
        # source /etc/locale.conf
        # source /etc/sysconfig/i18n
        # source /etc/environment
    c.临时更改
        export LANG=C.UTF-8
        export LANG=zh_CN.utf8

1.3 服务信息

01.服务器
    a.分类1
        网址:
        账号:
        密码:
        -----------------------------------------------------------------------------------------------------
        路径:
        分支:
        -----------------------------------------------------------------------------------------------------
        打开;code . 或者 Alt + P
        编码:export LANG=zh_CN.utf8
        启动:nohup env LANG=zh_CN.utf8 java -jar -Dfile.encoding=zh_CN.utf8 $JAR_HOME > $LOG_PATH 2>&1 &
        -----------------------------------------------------------------------------------------------------
        # ps -ef | grep java
    b.分类2
        网址:
        账号:
        密码:
        -----------------------------------------------------------------------------------------------------
        SSH:
        路径:
        编码:export LANG=zh_CN.utf8
    c.分类3
        网址:
        账号:
        密码:
        -----------------------------------------------------------------------------------------------------
        SSH:
        路径:
        编码:export LANG=zh_CN.utf8

02.数据库
    a.分类1
        网址:
        账号:
        密码:
    b.分类2
        网址:
        账号:
        密码:
    c.分类3
        网址:
        账号:
        密码:

03.服务器说明
    a.查看系统
        a.参数
            Static hostname: localhost.localdomain
                   Icon name: computer-vm
                     Chassis: vm
                  Machine ID: 92305feebc6240b381280ce8ff6aa3e3
                     Boot ID: 251b94bf7be545dcb731ff19014b83ad
              Virtualization: vmware
            Operating System: Rocky Linux 8.5 (Green Obsidian)
                 CPE OS Name: cpe:/o:rocky:rocky:8:GA
                      Kernel: Linux 4.18.0-348.7.1.el8_5.x86_64
                Architecture: x86-64
        b.说明
            操作系统:Rocky Linux 8.5 (Green Obsidian)
            内核版本:Linux 4.18.0-348.7.1.el8_5.x86_64
            架构:x86-64
            虚拟化:VMware
    b.查看情况
        a.查看jar包
            $ ps -ef
            $ ps -ef | grep java
        b.查看redis目录
            [root@localhost logs]# ps -ef | grep redis
            redis       3850       1  0 1月12 ?       00:33:22 /usr/bin/redis-server 127.0.0.1:6379
            root     1731531 1730430  0 11:08 pts/0    00:00:00 grep --color=auto redis
    c.nginx
        a.位置
            [root@localhost hr-backend]# nginx -t
            nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
            nginx: configuration file /etc/nginx/nginx.conf test is successful
        b.日志
            tail -f /var/log/nginx/access.log                                       --访问日志
            tail -f /var/log/nginx/error.log                                        --错误日志

2 管理平台

2.1 项目配置

01.模块文件
    a.gradle
        a.wrapper
            a.gradle-wrapper.jar
                META-INF
                org.gradle
                gradle-cli-classpath.properties
                gradle-cli-parameter-names.properties
                gradle-wrapper-classpath.properties
                gradle-wrapper-parameter-names.properties
            b.gradle-wrapper.properties
                distributionBase=GRADLE_USER_HOME
                distributionPath=wrapper/dists
                distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-bin.zip
                zipStoreBase=GRADLE_USER_HOME
                zipStorePath=wrapper/dists
        b.单文件
            build.gradle:每个模块的核心构建文件,它包含了具体的构建逻辑和配置
            gradlew:执行Gradle构建的入口脚本,它确保你使用的是正确的Gradle版本
            gradlew.bat:执行Gradle构建的入口脚本,它确保你使用的是正确的Gradle版本
            settings.gradle:定义了项目的整体结构,告诉Gradle有哪些模块
    b.build文件夹
        a.libs
            a.erp-1.0-SNAPSHOT.jar
                META-INF
                MANIFEST.MF:Manifest-Version: 1.0
            b.erp-1.0-SNAPSHOT.war
                META-INF
                MMANIFEST.MF:Manifest-Version: 1.0
        b.tmp
            a.jar
                MANIFEST.MF 内容为 Manifest-Version: 1.0
            b.war
                MANIFEST.MF 内容为 Manifest-Version: 1.0
    c.gradle文件夹
        a.wrapper
            a.gradle-wrapper.jar
                META-INF
                org.gradle
                gradle-cli-classpath.properties
                gradle-cli-parameter-names.properties
                gradle-wrapper-classpath.properties
                gradle-wrapper-parameter-names.properties
            b.gradle-wrapper.properties
                distributionBase=GRADLE_USER_HOME
                distributionPath=wrapper/dists
                distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-bin.zip
                zipStoreBase=GRADLE_USER_HOME
                zipStorePath=wrapper/dists

02.模块分析
    a.组成
        a.关系
            settings.gradle 定义了项目的整体结构,告诉Gradle有哪些模块。
            ⁠gradlew (或 ⁠gradlew.bat) 是执行Gradle构建的入口脚本,它确保你使用的是正确的Gradle版本。
            ⁠gradle.properties 提供了全局或项目级别的配置属性。
            build.gradle 是每个模块的核心构建文件,它包含了具体的构建逻辑和配置。
        b.流程
            当你运行⁠gradlew build这样的命令时,
            Gradle会首先读取⁠settings.gradle来了解项目结构,
            然后根据⁠gradle.properties中的配置,
            最后执行各个模块的⁠build.gradle中定义的构建任务。
    b.细节
        a.build.gradle:每个模块的核心构建文件,它包含了具体的构建逻辑和配置
            作用:这是Gradle构建脚本的核心。它定义了项目的构建逻辑,包括依赖管理、任务(tasks)定义、插件应用、以及各种构建配置。
            内容:plugins: 声明项目使用的Gradle插件,例如Java插件、Android插件等。
                 dependencies: 定义项目所需的外部库和模块依赖。
                 ⁠tasks: 定义自定义的构建任务,例如编译代码、打包、运行测试等。
                 ⁠repositories: 配置依赖的来源,比如Maven Central、JCenter等。
                 其他配置: 针对不同插件的特定配置,比如Java项目的⁠sourceCompatibility、Android项目的⁠compileSdkVersion等。
        b.gradle.properties
            # 设置守护进程的初始堆大小和最大堆大小
            org.gradle.jvmargs=-Xms2g -Xmx4g -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
            # 如果你的项目特别大,可以考虑启用并行构建
            org.gradle.parallel=true
            # 提高缓存大小以减少内存压力
            org.gradle.caching=true
            -------------------------------------------------------------------------------------------------
            作用:这个文件用于配置Gradle的全局属性或项目特定的属性。你可以在这里定义一些在构建过程中需要用到的变量,比如JVM参数、代理设置、或者自定义的构建属性。
            内容:以键值对的形式存储属性,例如⁠org.gradle.jvmargs=-Xmx2048m(设置JVM最大内存)或者⁠myCustomProperty=someValue。
        d.gradlew
            构建脚本,用于linux/mac
            -------------------------------------------------------------------------------------------------
            这两个是Gradle Wrapper的脚本文件。
            Gradle Wrapper允许你在没有预先安装Gradle的情况下运行Gradle构建。
            它会检查本地是否安装了指定版本的Gradle,如果没有,它会自动下载并使用该版本。
            内容:它们是可执行脚本,通常不需要手动修改。它们会调用Gradle Wrapper JAR文件来执行构建任务。
        e.gradlew.bat
            构建脚本,用于win
            -------------------------------------------------------------------------------------------------
            这两个是Gradle Wrapper的脚本文件。
            Gradle Wrapper允许你在没有预先安装Gradle的情况下运行Gradle构建。
            它会检查本地是否安装了指定版本的Gradle,如果没有,它会自动下载并使用该版本。
            内容:它们是可执行脚本,通常不需要手动修改。它们会调用Gradle Wrapper JAR文件来执行构建任务。
        f.index.html
            <html>
            <meta http-equiv="refresh" content="0; url=/erp/ds/jsp/dsjjNeweip.jsp">
            </html>
            -------------------------------------------------------------------------------------------------
            整个项目首页,对应【测试环境】
        g.settings.gradle
            rootProject.name = 'erp'
            include 'il'
            include 'sb'
            -------------------------------------------------------------------------------------------------
            作用: 这个文件是Gradle构建的入口,它定义了项目中包含的所有子项目(模块)。
            当你有一个多模块项目时,你需要在⁠settings.gradle中声明这些模块。
            内容: 通常包含⁠include 'module1', 'module2'这样的语句,用于告诉Gradle你的项目由哪些模块组成。对于单模块项目,这个文件可能非常简单,甚至只有一行代码。

2.2 前端管理

01.常用信息1
    a.说明
        a.本机
            v14.16.1
            v20.10.0
            -------------------------------------------------------------------------------------------------
            nvm alias default v14.16.1
            nvm alias default v20.10.0
        b.分支
            jh4j-ui(默认master)   14.21.1
            jh4j-ui-performance    14.21.1
    b.npm
        a.镜像
            npm set registry http://172.17.8.54/
            npm adduser --registry http://172.17.8.54/
            npm profile set password --registry http://172.17.8.54/
            -------------------------------------------------------------------------------------------------
            npm login
            j057240
            qwER159263
            -------------------------------------------------------------------------------------------------
            npm config ls
        b.命令
            # 安装
            npm install
            # 启动
            npm run dev
    c.pnpm
        a.镜像
            pnpm set registry http://172.17.8.54/
            pnpm adduser --registry http://172.17.8.54/
            pnpm profile set password --registry http://172.17.8.54/
            -------------------------------------------------------------------------------------------------
            pnpm login
            j057240
            qwER159263
            -------------------------------------------------------------------------------------------------
            pnpm c get
        b.命令
            # 安装
            pnpm install
            # 以 dev 模式启动 Vite 开发服务器
            pnpm dev
            # 如果你使用的是 npm
            npm run dev

02.常用信息2
    a.附件上传
        a.问题
            图片上传
            GET请求,/view/**,正则匹配不一样
            绕开网关可以访问,走网关不可以访问
        b.SpringMvc 使用 AntPathMatcher 模式
            /view/** 可以匹配 /view/ 下任意层级路径,包括多级目录和带特殊字符的文件名
            * 匹配单层路径部分,** 可跨多层目录
            特殊字符或中文路径一般可直接匹配,只要 Controller 方法对应
        c.SpringGateway 使用断言(Predicates)和 RegExp,且处理方式更严格:
            /view/** 理论上能匹配多级目录。但 Gateway 配置时还涉及 StripPrefix、RewritePath 等 Filter,如果 rewrite 或 strip 配置不合理,会造成路径解析出错,比如中文/特殊符号未 decode,或路径”提前截断”。
            默认断言 Path 只按 URI 匹配,若有 RewritePath,需保证正则 `(?<segment>.*)` 能处理带编码的路径,否则特殊文件名会被 Gateway 拦截/错误处理。
            Gateway 处理正则时,某些符号(如 %E5%BC%A0…)需在正则和后端 Controller 都能被 decode,否则原始/转义路径难匹配,报 500
    b.图片显示
        a.加入白名单
            位置:系统管理 -> 权限设置 -> 接口管理
            筛选框(服务名称):入职管理 / 入职管理-J057117 / 入职管理-J057240
            -------------------------------------------------------------------------------------------------
            查看照片文件 GET /onboard/applicant/image/view/photo/** 入职管理 默认动作
            白名单:是
            免登白名单:是
        b.前端报文
            http://172.17.8.57:81/uat-api/onboard/applicant/image/view/photo/%E9%83%91%E8%89%B3_18687654321_%E7%85%A7%E7%89%87_20251014_111839.jpg
            {"code":5000,"message":"请求异常,请联系管理员","data":null}
        c.67服务器日志
            [root@jh-zjapp ~]# ps -ef | grep java
            root     1635853       1  1 9月29 ?       03:27:21 /usr/local/jdk-1.8.0_191/bin/java -jar /home/jh4j-product-onboard-service-2.3.0.jar --spring.application.name=jh4j-product-onboard

2.3 本地扩展:ext

01.快速开始
    a.环境
        a.正式
            网址:
            账户:
            密码:
        b.测试
            网址:
            账号:
            密码:
    b.代理
        a.WiFi / 以太网
            公司:172.16.10.130
            阿里云:223.5.5.5
            阿里云:223.6.6.6
        b.surge
              "icscrepo1.icsc.com.tw": "8.8.8.8#DIRECT"
            fake-ip-filter:
              - "icscrepo1.icsc.com.tw"
            rules:
              - 'DOMAIN,icscrepo1.icsc.com.tw,DIRECT'
        c.clash verge
            skip-proxy:追加 icscrepo1.icsc.com.tw
            [Rule]:追加 DOMAIN,icscrepo1.icsc.com.tw,DIRECT
            [Host]:追加 icscrepo1.icsc.com.tw = server:8.8.8.8 / icscrepo1.icsc.com.tw = 198.18.3.169(废弃) / 域名+端口 / ip+端口 / HEAD与GET请求
        d.镜像
            buildscript {
                repositories {
                    maven { url 'http://icscrepo1.icsc.com.tw/repository/maven-public' }
                    maven {
                        url "https://plugins.gradle.org/m2/"
                    }
                }
                dependencies {
                    classpath "gradle.plugin.com.gorylenko.gradle-git-properties:gradle-git-properties:1.5.1"
                }
            }
        e.总结
            编译,需要关闭TUN模式,以及整个Surge/Clash,需访问【icscrepo1.icsc.com.tw】构建
            耗时:自动将【erp(外部源)】放入【本地外部Tomcat】对应的【webapps、work】文件夹,耗时【4分30秒】
            经测试,【/Users/troyesivens/Documents/software/apache-tomcat-9.0.106】,可以完美运行
            经测试,【/opt/homebrew/Cellar/tomcat@9/9.0.104/libexec】,brew安装的Tomcat,缺少配置,可自行补全
    c.配置Tomcat
        a.服务器
            应用程序服务器:Tomcat 9.0.106
            启动后默认浏览器:http://localhost:9001/erp/
            虚拟机选项:-Dcom.icsc.compNo=erp -Dcom.icsc.serverName-ERPerp -Dcom.icsc.instanceNo=0l -Dcom.icsc.dpms.de.dejc300.j2ee=true
            执行“更新”操作时:重启服务器
            JRE:1.8
            Tomcat服务器设置:HTTP端口(9001)、JMX端口(1098)
        b.部署
            在服务器启动时部署:erp(外部源)
            应用程序上下文:/erp
        c.启动
            前提:必须编译整个项目
            第1步:将 local/config/localAjax.xml 更新到 ../apache-tomcat-9.0.106/bin/config/erp/local/localAjax.xml
            第2步:将 local/build/libs/local.jar 手动放入 WEB-INF/lib/local.jar
            报错:遇到RMI,1099连接有问题,请停掉全部java应用
            访问:http://localhost:9001/erp/local/ajax?_controller=localTest&_action=list
    d.配置Tomcat-local
        a.地址
            /opt/homebrew/Cellar/tomcat@9/9.0.104/libexec/lib
            文件(ojdbc8.jar)
            -------------------------------------------------------------------------------------------------
            /opt/homebrew/Cellar/tomcat@9/9.0.104/libexec/webapps
            文件夹(erp -> META-INF -> MANIFEST.MF、war-tracker)
        b.服务器
            应用程序服务器:Tomcat 9.0.104
            启动后默认浏览器:http://localhost:9002/erp/
            虚拟机选项:-Dcom.icsc.compNo=erp -Dcom.icsc.serverName-ERPerp -Dcom.icsc.instanceNo=0l -Dcom.icsc.dpms.de.dejc300.j2ee=true
            执行“更新”操作时:重启服务器
            JRE:1.8
            Tomcat服务器设置:HTTP端口(9002)、JMX端口(1099)
        c.部署
            在服务器启动时部署:erp(外部源)
            应用程序上下文:/erp
        d.启动
            前提:必须编译整个项目
            第1步:将 local/config/localAjax.xml 更新到 ../apache-tomcat-9.0.105/bin/config/erp/local/localAjax.xml
            第2步:将 local/build/libs/local.jar 手动放入 WEB-INF/lib/local.jar
            报错:遇到RMI,1099连接有问题,请停掉全部java应用
            访问:http://localhost:9002/erp/local/ajax?_controller=localTest&_action=list

02.扩展开发
    a.guide:开发规范
        a.anno
            @dsjcAuthResourceInfoId("HDJJE0610")
            @dejcReqParam:post参数注解
            @dejcTransactional:事务注解
            @dejcPureSvc:返回图片
        b.rules
            api:对接三方,提供WS系統的api,hdjcApiWS
            bsTable:连接Sql的对象
            batch:批量操作API,对接rest、rpt、bsTable
            -------------------------------------------------------------------------------------------------
            bs:bussiness对象
            di:sring中di对象
            dao:dao对象、vo对象
            entity:entity对象
            report:report对象
            helper:helper对象
            type:字段类型转换
            payroll:支付回调
            -------------------------------------------------------------------------------------------------
            rest:理解为三层中的控制层
            rpt:理解为三层中的业务层,为rest的下层
            -------------------------------------------------------------------------------------------------
            ui:理解为三层中的controller层中返回的UI组件,返回内容为com.icsc.dpms.de.rest.dejcRestInfoOut组件,属性有msg、msgType、error、voContainer、uiCtrl、voCache、uuid
            tag:理解为三层中的controller层中返回的tag组件
            thrd:理解为三层中的controller层中返回的thrd组件
            link:直接解析到html/jsp的代码片段,<%=hdjcLinkHR.getHRM0VOJSON()%>
            upload:理解为三层中的controller层中返回的upload组件,返回内容为com.icsc.hb.upload.hbjiExcelUpload组件,属性有upload、setParameter、getObject、getMsg
            -------------------------------------------------------------------------------------------------
            model:直接解析到html/jsp的代码片段,<%=hbjcCommentSelectionDefault.getDefault("qry.commentSelect")%>
            monthBonus:实际为 bs 中 hbjcBsAC020类 下面的一个属性,比如hbjcMonthBonus_calDeptBonusByLeader.java
            -------------------------------------------------------------------------------------------------
            util:工具包
    b.local:本地扩展模块
        a.分类1:utils工具包
            a.bean
                Bean2SqlUtils.java:类转sql
                BeanConvertUtils.java:bean转换util
            b.common
                PaginationUtil:分页工具类
            c.constant
                MRInterfaceUrl:原料调物流接口量类
            d.db
                JdbcUtil.java:JDBC工具类,java:comp/env/jdbc/dserp
                JdbcUtilEp.java:JDBC工具类,连接Ep数据库,java:comp/env/jdbc/dserpmq
        b.分类2:utils工具包
            a.file
                DrjcFileUtil.java:附件工具
            b.http
                OkHttpUtil:HTTP工具类,支持get、post
            c.json
                JsonUtil:JSON工具类
            d.properties
                PropertiesUtil:获取资源文件工具类
            e.xml
                XmlParserUtils:解析XML工具类

2.4 对接权限:auth

01.Token管理体系
    a.存储方式
        Token 存储在 Cookie (Admin-Token)
        权限列表存储在 LocalStorage (Permission)
        用户信息存储在 Pinia Store (useUserStore)
    b.自动注入流程
        请求拦截器 → 从Cookie获取Token → 添加到请求头 → Bearer Token格式
    c.核心工具
        // Token操作
        import { getToken, setToken, removeToken } from '@jhlc/common-core/src/util/auth'
        
        // 用户Store
        import useUserStore from '@jhlc/common-core/src/store/user'
        const userStore = useUserStore()

02.权限控制三种方式
    a.方式一: 指令式权限 (v-auth)
        el-button v-auth="'featuremodelmanage_save'">保存</el-button>
    b.方式二: 角色权限 (v-role)
        <el-button v-role="['admin_role', 'hr_role']">管理功能</el-button>
    c.方式三: 编程式权限
        const canEdit = computed(() => {
          return userStore.permissions.includes('system:user:edit') ||
                 userStore.permissions.includes('*:*:*')
        })

03.请求架构三层封装
    a.图示
        业务组件
            ↓
        API抽象层 (getAction, postAction)
            ↓
        Axios拦截器 (自动添加Token, 统一错误处理)
            ↓
        后端API
    b.关键特性
        自动Token注入: 拦截器自动添加 Authorization: Bearer
        统一错误处理: 401自动跳转登录, 500统一提示
        防抖机制: 2秒内多次401只弹一次窗
        智能交互: 区分页面刷新和正常调用

04.用户信息获取方式
    a.后端(Java)
        // 获取当前用户编号
        String userNo = AuthUtil.getLoginUserNo();
        
        // 获取用户角色
        Set<String> roles = AuthUtil.getRoles();
        
        // 获取租户ID
        String tenantId = AuthUtil.getTenantId();
    b.前端(Vue)
        const userStore = useUserStore()
        
        // 获取用户信息
        userStore.name          // 用户姓名
        userStore.userId        // 用户ID
        userStore.userNo        // 用户工号
        userStore.permissions   // 权限列表
        userStore.roles         // 角色列表

05.数据权限控制 (后端)
    a.注解式控制
        @DataPermissions({
            @DataPermission(
                controlType = "in",
                controlTableAlias = "t",
                controlField = "ORG_ID",
                bizType = BizOrganizationRelationEnum.PERFORMANCE_ACTIVITY
            )
        })
        public JhPage<ActivityDTO> listActivities(JhPage<ActivityDTO> page, ActivityQuery query) {
            // AOP会自动在SQL中注入组织权限过滤条件
            return activityMapper.selectPage(page, query);
        }
    b.核心原理
        超级管理员豁免: SUPER_ROLE跳过数据权限过滤
        组织树过滤: 根据用户所属组织自动生成 WHERE EXISTS 条件
        ThreadLocal传递: 通过 DataPermissionContextHolder 传递SQL片段
        MyBatis拦截器: 在执行SQL前自动拼接权限条件

06.SSO单点登录流程
    a.流程
        // 1. URL携带ticket参数
        http://app.com/?ticket=abc123
        
        // 2. 通过ticket换取access_token
        const authResponse = await postAction("auth/oauth/token", null, {
          grant_type: "sso_rpc",
          ticket: ticket,
          client_code: encrypt(client_id + "," + client_secret)
        })
        
        // 3. 保存Token到Cookie
        setToken(authResponse.access_token)
        
        // 4. 获取用户详细信息
        const userResponse = await getAction("/hrms/user/getByUserNo", {
          userNo: authResponse.user_no
        })
        
        // 5. 设置用户信息到Store
        useUserStore().setName(userResponse.data.name)
        
        // 6. 跳转到目标页面
        next({ path: redirect || "/home" })

07.关键安全机制
    a.Token过期处理
        // 响应拦截器捕获401
        if (code === 4001 || code === 401) {
          removeToken()  // 清除Token
          
          // 防抖处理,2秒内去重
          FunctionExecUtil.debounceIm(() => {
            // 区分页面刷新和正常调用
            if (locationRefreshed || isNavigate) {
              // 直接跳转登录
              location.reload()
            } else {
              // 弹窗询问用户
              ElMessageBox.confirm('登录状态已过期...', '系统提示')
            }
          }, "loginTimeOut", 2000)
        }
    b.Token自动刷新
        // 每10分钟检测Token有效性
        FunctionExecUtil.execInterval(() => {
          envConfig().request({
            url: "/auth/oauth/check_token",
            params: { token: getToken() }
          })
        }, "autoLogin", 600000, true)

2.5 本地开发:local

01.项目创建
    a.jh4j-product-onboard
        a.settings.xml
            <?xml version="1.0" encoding="UTF-8"?>

            <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">

                <pluginGroups></pluginGroups>

                <proxies></proxies>

                <servers></servers>

                <mirrors>
                    <mirror>
                        <id>jingang</id>
                        <mirrorOf>*</mirrorOf>
                        <name>jingang maven</name>
                        <url>http://172.17.8.55/repository/maven-public</url>
                    </mirror>
                </mirrors>
            </settings>
        b.安装
            mvn install:install-file \
              -Dfile=/path/to/your/jh4j-cloud-archetype-service-1.3.3.jar \
              -DgroupId=com.jhict \
              -DartifactId=jh4j-cloud-archetype-service \
              -Dversion=1.3.3 \
              -Dpackaging=maven-archetype
        c.创建项目
            mvn archetype:generate \
              -DgroupId=com.jhict \
              -DartifactId=jh4j-cloud-demo \
              -Dversion=1.3.3 \
              -Dpackage=com.jhict.demo \
              -DarchetypeGroupId=com.jhict \
              -DarchetypeArtifactId=jh4j-cloud-archetype-service \
              -DarchetypeVersion=1.3.3 \
              -DarchetypeCatalog=local \
              -DinteractiveMode=false
            -------------------------------------------------------------------------------------------------
              | 参数                     | 说明
              |-------------------------|-------------------------------
              | DgroupId                | 项目组织标识
              | DartifactId             | 项目名称(服务名规范:jh4j-cloud-{业务模块})
              | Dversion                | 初始版本号
              | Dpackage                | 基础包路径(建议:com.jhict.{业务模块})
              | DarchetypeGroupId       | 脚手架组织标识
              | DarchetypeArtifactId    | 脚手架项目标识
              | DarchetypeVersion       | 脚手架版本(必须与pom中版本一致)
              | DarchetypeCatalog=local | 强制使用本地仓库的脚手架模板
              | DinteractiveMode=false  | 禁用交互模式(批量执行时必需)
        d.创建项目,自定义项目名
            mvn archetype:generate \
              -DgroupId=com.jhict \
              -DartifactId=jh4j-cloud-onboard \
              -Dversion=1.3.3 \
              -Dpackage=com.jhict.onboard \
              -DarchetypeGroupId=com.jhict \
              -DarchetypeArtifactId=jh4j-cloud-archetype-service \
              -DarchetypeVersion=1.3.3 \
              -DarchetypeCatalog=local \
              -DinteractiveMode=false
    b.jh4j-product-onboard-ui
        a.注册
            a.npm
                npm:npm set registry http://172.17.8.54/
                npm:npm adduser --registry http://172.17.8.54/
                npm:npm profile set password --registry http://172.17.8.54/
            b.yarn
                Yarn 经典版本的配置不同于 Yarn 2+。如需了解更多,请访问 Yarn 经典版本。
                yarn config set registry http://172.17.8.54/
                Yarn Berry 不支持 --registry 这个参数,而是所有的配置需要定义在项目根目录下的 yarnrc.yaml 文件里。如需了解更多,请访问 Yarn Berry。
                // .yarnrc.yml
                npmRegistryServer: "http://172.17.8.54/"
                unsafeHttpWhitelist:
                  - 172.17.8.54
            c.pnpm
                pnpm:pnpm set registry http://172.17.8.54/
                pnpm:pnpm adduser --registry http://172.17.8.54/
                pnpm:pnpm profile set password --registry http://172.17.8.54/
        b.模块
            a.@jhlc/common-core
                npm install@jhlc/[email protected]
                yarn add @jhlc/[email protected]
                pnpm install @jhlc/[email protected]
            b.@jhlc/common-resource
                npm install @jhlc/[email protected]
                yarn add @jhlc/[email protected]
                pnpm install @jhlc/[email protected]
            c.@jhlc/common-visualcode
                npm install @jhlc/[email protected]
                yarn add @jhlc/[email protected]
                pnpm install @jhlc/[email protected]
            d.@jhlc/components
                npm install @jhlc/[email protected]
                yarn add @jhlc/[email protected]
                pnpm install @jhlc/[email protected]
            e.@jhlc/jh-ui
                npm install @jhlc/[email protected]
                yarn add @jhlc/[email protected]
                pnpm install @jhlc/[email protected]
            f.@jhlc/markdown-editor
                npm install @jhlc/[email protected]
                yarn add @jhlc/[email protected]
                pnpm install @jhlc/[email protected]
            g.@jhlc/mobile-platform
                npm install @jhlc/[email protected]
                yarn add @jhlc/[email protected]
                pnpm install @jhlc/[email protected]
            h.@jhlc/platform
                npm install @jhlc/[email protected]
                yarn add @jhlc/[email protected]
                pnpm install @jhlc/[email protected]
            i.@jhlc/types
                npm install @jhlc/[email protected]
                yarn add @jhlc/[email protected]
                pnpm install @jhlc/[email protected]
            j.@jhlc/utils
                npm install @jhlc/[email protected]
                yarn add @jhlc/[email protected]
                pnpm install @jhlc/[email protected]
                -------------------------------
                const utils = require('utils');
            k.element-plus
                npm install [email protected]
                yarn add [email protected]
                pnpm install [email protected]
        c.使用
            a.npm
                npm install @jhlc/[email protected]
                npm install @jhlc/[email protected]
                npm install @jhlc/[email protected]
                npm install @jhlc/[email protected]
                npm install @jhlc/[email protected]
                npm install @jhlc/[email protected]
                npm install @jhlc/[email protected]
                npm install @jhlc/[email protected]
                npm install @jhlc/[email protected]
                npm install @jhlc/[email protected]
                npm install [email protected]
            b.yarn
                yarn install @jhlc/[email protected]
                yarn install @jhlc/[email protected]
                yarn install @jhlc/[email protected]
                yarn install @jhlc/[email protected]
                yarn install @jhlc/[email protected]
                yarn install @jhlc/[email protected]
                yarn install @jhlc/[email protected]
                yarn install @jhlc/[email protected]
                yarn install @jhlc/[email protected]
                yarn install @jhlc/[email protected]
                yarn install [email protected]
            c.pnpm
                pnpm install @jhlc/[email protected]
                pnpm install @jhlc/[email protected]
                pnpm install @jhlc/[email protected]
                pnpm install @jhlc/[email protected]
                pnpm install @jhlc/[email protected]
                pnpm install @jhlc/[email protected]
                pnpm install @jhlc/[email protected]
                pnpm install @jhlc/[email protected]
                pnpm install @jhlc/[email protected]
                pnpm install @jhlc/[email protected]
                pnpm install [email protected]

02.项目配置
    a.管理平台
        a.数据链路
            子服务(9931) -> 网关(9000) -> 晋钢信息化综合管理平台 + 通过nacos来桥接,子服务去注册,网关去发现 -> 网关(9000) -> 前端(8001)
        b.第1步:注册应用
            位置:系统管理 -> 菜单程序 -> 子系统管理 -> 新建
            -------------------------------------------------------------------------------------------------
            上级菜单:根模块
            路由:onboard
            系统名称:入职管理
            菜单名称编码:ruzhiguanli
            显示排序:15
            是否隐藏:否
        c.第2步:注册子服务(jh4j-product-onboard)
            位置:系统管理 -> 公共配置 -> 系统字典 -> 左侧【系统词典】的【服务信息」 -> 服务列表 -> 新增服务
            选中第1步中注册的应用:入职管理
            -------------------------------------------------------------------------------------------------
            词典类型:服务列表
            strKey:jh4j-product-onboard
            服务中文名:入职管理
            服务中文名编码:sysDict.dtl.strValue.serviceInfo_jh4j-product-onboard_ruzhiguanli
            包扫描路径:com.jhict.product.onboard
            前缓:/onboard
            -------------------------------------------------------------------------------------------------
            词典类型:服务列表
            strKey:jh4j-product-onboard-J057117
            服务中文名:入职管理-J057117
            服务中文名编码:sysDict.dtl.strValue.serviceInfo_jh4j-product-onboard-J057117_ruzhiguanlij057117
            包扫描路径:com.jhict.product.onboard
            前缓:/onboard
            -------------------------------------------------------------------------------------------------
            词典类型:服务列表
            strKey:jh4j-product-onboard-J057240
            服务中文名:入职管理-J057240
            服务中文名编码:sysDict.dtl.strValue.serviceInfo_jh4j-product-onboard-J057240_ruzhiguanlij057240
            包扫描路径:com.jhict.product.onboard
            前缓:/onboard
        d.第3步:收集后端API接口
            位置:系统管理 -> 权限设置 -> 接口管理
            -------------------------------------------------------------------------------------------------
            筛选:服务名称 -> 入职管理 / 入职管理-J057117 / 入职管理-J057240
            操作:编码接口 -> 服务名称:入职管理  -> 指定路径:/**  -> 收集
            -------------------------------------------------------------------------------------------------
            查看照片文件 GET /onboard/applicant/image/view/photo/** 入职管理 默认动作
            白名单:是
            免登白名单:是
        e.第4步:配置前端Page页面
            查看:显示模块
            新建:目录 / 菜单
            位置:系统管理 -> 菜单程序 -> 菜单管理 -> 应用【入职管理】 -> 应聘管理:面试分配 + 面试评估 + 面试录用
            -------------------------------------------------------------------------------------------------
            上级菜单:应聘管理
            菜单图标:空白
            应用选择:入职管理
            使用缓存:使用
            页面挑选框:请选择
            显示排序:1
            菜单路径:onbAllocate
            菜单名称:面试分配
            菜单名称编码:menu:ruzhiguanli:mianshifenpei
            组件路径:onboard/onbAllocate/index
            权限标识:onbAllocate
            是否隐藏:否
    b.子服务:jh4j-cloud-gateway
        a.使用说明
            a.不同环境
                本地IDEA -> 网关使用 -> jh4j-cloud-gateway-J057117-uat.yml
                生产环境  -> 网关使用 -> jh4j-cloud-gateway-uat.yml
            b.接口调用
                前端页面 -> 调用子服务(其他人的电脑) -> 走网关
                前端页面 -> 调用自己的服务(自己的电脑)-> 自己的服务器+端口
            c.访问
                后端直接IP+端口:http://localhost:9931/onboard/list?current=1&size=5
                前端走vite.config.ts配置:http://172.17.8.57:9000/onboard/list?current=1&size=5
        b.本地服务:jh4j-cloud-gateway-service 的 bootstrap.yml
            spring:
              application:
                name: jh4j-cloud-gateway-J057117
              cloud:
                nacos:
                  config:
                    server-addr: 172.17.8.57:8848
                    file-extension: yml
                    group: JH4J
                    username: nacos
                    password: JinG@ng2025
                    shared-configs:
                      - dataId: application-uat.yml
                        group: JH4J
                      - dataId: jh4j-cloud-gateway-J057117-uat.yml        # 使用jh4j-cloud-gateway-J057117-uat.yml
                        group: JH4J
                    namespace: uat
                  discovery:
                    server-addr: 172.17.8.57:8848
                    group: JH4J
                    namespace: uat
                  username: nacos
                  password: JinG@ng2025
              profiles:
                active: uat
              main:
                allow-bean-definition-overriding: true
                web-application-type: reactive
              boot:
                admin:
                  client:
                    enabled: false
        c.网关列表:nacos 的 jh4j-cloud-gateway-J057117-uat.yml
            server:
              port: 9000

            spring:
              cloud:
                gateway:
                  routes:
                  # 招聘管理
                  - id: smartpark-card
                    uri: lb://jh-smartpark-card
                    predicates:
                    - Path=/card/**
                    filters:
                    - RewritePath=/card(?<segment>/?.*), $\{segment}
                  # 入职管理
                  - id: product_onboard
                    uri: lb://jh4j-product-onboard-J057117                # 对应【bootstrap.yml】的【spring.application.name】
                    predicates:
                    - Path=/onboard/**
                    filters:
                    - RewritePath=/onboard(?<segment>/?.*), $\{segment}
        d.服务列表:nacos 的 jh4j-cloud-system-uat.yml
            server:
              port: 9001

            ...... 使用公共,无需再配置

            jh4j:
              system:
                service:
                  relations:
                    - parentService: jh4j-cloud-hrms
                      childrenService:
                        - jh4j-cloud-hrms-025966
                        - jh4j-cloud-hrms-028114
                        - jh4j-cloud-hrms-409102
                        - jh4j-cloud-hrms-028106
                    - parentService: jh4j-product-onboard                 # 服务列表
                      childrenService:
                        - jh4j-product-onboard-J057117                    # 负载均衡1,对应【bootstrap.yml】的【spring.application.name】
                        - jh4j-product-onboard-J057240                    # 负载均衡2,对应【bootstrap.yml】的【spring.application.name】
                    - parentService: jh4j-product-performance
                      childrenService:
                        - jh4j-product-performance-027198
    c.子服务:jh4j-product-onboard
        a.本地服务:jh4j-product-onboard-service 的 bootstrap.yml
            spring:
              application:
                name: jh4j-product-onboard-J057117
              cloud:
                nacos:
                  config:
                    server-addr: 172.17.8.57:8848
                    file-extension: yml
                    group: JH4J
                    shared-configs:
                      # # 主要yml配置
                      - dataId: application-uat.yml
                        group: JH4J
                      # # 主要yml中的sql配置
                      - dataId: datasource-onboard-uat.yml
                        group: JH4J
                      - dataId: seata-uat.yml
                        group: JH4J
                    namespace: uat
                    # 项目yml扩展配置,你设置了前缀为 ⁠jh4j-cloud-onboard,应用名是 ⁠jh4j-cloud-onboard-J057117,那么应用会自动去加载以 ⁠jh4j-cloud-onboard 开头的配置文件,比如 ⁠jh4j-cloud-onboard-J057117-uat.yml
                    prefix: jh4j-product-onboard
                  discovery:
                    server-addr: 172.17.8.57:8848
                    group: JH4J
                    namespace: uat
                  username: nacos
                  password: JinG@ng2025
              profiles:
                active: uat

              main:
                allow-bean-definition-overriding: true
        b.主要yml配置:nacos 的 application-uat.yml
            jh4j:
              ...... 使用公共,无需再配置

              loadbalancer:                                               # K8S中的负载均衡
                classPath: com.jhict.starter.config.IpProximityLoadBalancerConfig
                serviceName: jh4j-cloud-system,jh4j-cloud-gateway,jh4j-cloud-hrms,jh4j-cloud-auth,jh4j-cloud-code,jh4j-cloud-store,jh4j-cloud-oams,jh4j-cloud-flow,jh4j-cloud-jhapi,jh4j-cloud-datav,jh4j-cloud-devops-monitor,jhip-mainpage
        c.主要yml中的sql配置:nacos 的 datasource-onboard-uat.yml
            spring:
              # ===============================================================
              # Jackson JSON 序列化/反序列化配置 (Jackson JSON Serialization/Deserialization Configuration)
              # ===============================================================
              jackson:
                # 全局设置日期类型(如 Date, LocalDateTime)序列化为JSON字符串时的格式
                date-format: yyyy-MM-dd HH:mm:ss
                # 设置时区,保证日期时间处理的一致性,GMT+8是中国标准时间
                time-zone: GMT+8
                serialization:
                  # 设置为false,表示将日期序列化为字符串格式(如 "2025-08-20 20:20:20"),而不是时间戳(如 1755778820000)
                  write-dates-as-timestamps: false
                  # 设置为false,当遇到空的Java对象时不抛出异常,允许序列化空对象(如只有getter没有属性的对象)
                  fail-on-empty-beans: false
                deserialization:
                  # 设置为false,表示当JSON字符串中包含Java对象没有的属性时,不抛出异常,而是直接忽略
                  fail-on-unknown-properties: false
                  # 支持BigDecimal(已有,正确)- 设置为true时,JSON中的浮点数将被反序列化为BigDecimal而不是Double,提供更高的精度
                  use-big-decimal-for-floats: true
                  # 设置为true,允许将单个值作为数组处理。例如:JSON中 "items": "single" 可以反序列化到 List<String> items
                  accept-single-value-as-array: true
                  # 设置为true,将空字符串("")视为null对象,防止空字符串导致的反序列化异常
                  accept-empty-string-as-null-object: true
                # 解析器配置,提高容错性
                parser:
                  # 设置为true,允许JSON字符串中包含注释(// 或 /* */),提高配置文件的可读性
                  allow-comments: true
                  # 设置为true,允许JSON字符串使用单引号包围字段名和字符串值,而不仅仅是双引号
                  allow-single-quotes: true
                  # 设置为true,允许JSON字段名不使用引号包围(如 {name: "value"} 而不是 {"name": "value"})
                  allow-unquoted-field-names: true
                # 全局属性包含策略 - NON_NULL表示序列化时忽略值为null的字段,减少JSON体积
                default-property-inclusion: NON_NULL
                # 映射器级别配置,用于控制Jackson ObjectMapper的行为
                mapper:
                  # 设置为true,启用大小写不敏感的属性映射。JSON中的 "UserName" 可以映射到 Java 的 "username" 字段
                  accept-case-insensitive-properties: true
              datasource:
                dynamic:
                  primary: master
                  strict: true
                  datasource:
                    master:
            #          url: jdbc:oracle:thin:@172.17.8.56:1521/jgdb
            #          username: JGTUSER
            #          password: JGTUSER#2025
            #          driver-class-name: oracle.jdbc.driver.OracleDriver
                      url: jdbc:mysql://172.17.12.67/jh4j-product-onboard?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
                      username: root
                      password: K9@pR3!sT7$qL2%
                      driver-class-name: com.mysql.cj.jdbc.Driver
                    onboard: # 新增的 MySQL 数据源
                      url: jdbc:mysql://172.17.12.67/jh4j-product-onboard?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
                      username: root
                      password: K9@pR3!sT7$qL2%
                      driver-class-name: com.mysql.cj.jdbc.Driver
                type: com.alibaba.druid.pool.DruidDataSource
                driver-class-name: com.mysql.cj.jdbc.Driver
                url: jdbc:mysql://172.17.12.67/jh4j-product-onboard?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
                username: root
                password: K9@pR3!sT7$qL2%
                druid:
                  keepAlive: true
                  initial-size: 5
                  min-idle: 5
                  maxActive: 20
                  # 配置获取连接等待超时的时间
                  maxWait: 60000
                  # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
                  timeBetweenEvictionRunsMillis: 60000
                  # 开启日志记录到info中,默认实现类DruidDataSourceStatLoggerImpl,info记录日志
                  #timeBetweenLogStatsMillis: 60000
                  # maxEvictableIdleTimeMillis: 360000
                  # 配置一个连接在池中最小生存的时间,单位是毫秒
                  minEvictableIdleTimeMillis: 300000
                  validationQuery: SELECT 'x' FROM DUAL
                  testWhileIdle: true
                  testOnBorrow: false
                  testOnReturn: false
                  logAbandoned: true
                  removeAbandoned: true
                  removeAbandonedTimeout: 1800
                  # 打开PSCache,并且指定每个连接上PSCache的大小
                  # 官方文档表示oracle下有提升,mysql下建议关闭
                  poolPreparedStatements: false
                  maxPoolPreparedStatementPerConnectionSize: -1
                  # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
                  filters: stat,log4j2
                  # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
                  connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
                  # aop监控
                  # aop-patterns: com.nisco.dms.base.service.*,com.nisco.dms.business.service.*
                  # 配置DruidStatFilter
                  web-stat-filter:
                    enabled: true
                    url-pattern: "/*"
                    # 不统计的url
                    exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"
                  # 配置DruidStatViewServlet

            # ===============================================================
            # MyBatis-Plus ORM 框架配置
            # ===============================================================
            mybatis-plus:
              # 指定 Mapper XML 文件的位置。classpath: 表示从类路径下查找
              mapper-locations: classpath:/mybatis/*Mapper.xml
              # 实体类(Entity)所在的包路径。配置后可在 Mapper XML 中直接使用类名作为别名
              type-aliases-package: com.jhict.product.onboard.api.entity
              # 枚举类所在的包路径。MyBatis-Plus 会自动扫描并处理这些枚举类型与数据库字段的映射
              type-enums-package: com.jhict.product.onboard.api.enums
              # 自定义 TypeHandler 所在包。MyBatis-Plus 启动时会扫描此包下所有继承 BaseTypeHandler,并标注 @MappedJdbcTypes 的类,自动注册到全局配置,用于复杂类型(如 JSON 与对象)映射
              type-handlers-package: com.jhict.product.onboard.api.hander
              # 全局策略配置
              global-config:
                # ---------- 数据库相关配置 ----------
                db-config:
                  # 主键生成策略:
                  # AUTO(0): 数据库自增
                  # INPUT(1): 用户输入
                  # ASSIGN_ID(2): 雪花算法
                  # ASSIGN_UUID(3): UUID 字符串
                  id-type: ASSIGN_UUID
                  # 字段插入和更新策略:
                  # IGNORED(0): 忽略判断
                  # NOT_NULL(1): 只对非 NULL 字段操作
                  # NOT_EMPTY(2): 只对非空(非 NULL 且非空串/空集合)字段操作
                  field-strategy: 2
                  # ❌ 已废弃:3.4.x版本后不再生效,功能已迁移至 configuration.map-underscore-to-camel-case
                  # 原因:为了与 MyBatis 原生配置保持一致,避免配置重复和混乱
                  # db-column-underline: true
                  # ❌ 已废弃:3.4.x版本后功能已内置,无需手动配置
                  # 原因:MyBatis-Plus 会自动监听 XML 文件变化,该配置项已无实际作用
                  # refresh-mapper: true
                  # ❌ 已废弃:3.4.x版本后配置方式发生变化
                  # 原因:该配置项在新版本中被重新设计,改为更细粒度的控制
                  # capital-mode: true
                  # 逻辑删除功能配置:
                  # 实体类属性名,对应数据库逻辑删除字段
                  logic-delete-field: deletedFlag
                  # 逻辑删除时字段值
                  logic-delete-value: 1
                  # 未删除时字段值
                  logic-not-delete-value: 0
                # ---------- 自动填充策略(MetaObjectHandler) ----------
                # 注册实现了 MetaObjectHandler 接口的 Bean 名称或类,可在插入/更新时自动填充字段
                # meta-object-handler: com.jhict.product.onboard.config.MyMetaObjectHandler
              # MyBatis 原生配置
              configuration:
                # 开启驼峰命名自动映射(替代已废弃的 db-column-underline)
                map-underscore-to-camel-case: true
                # 是否开启 MyBatis 二级缓存(默认关闭)
                cache-enabled: false
                # 查询结果为 NULL 时,是否调用实体 setter(可触发默认值)
                call-setters-on-nulls: true
                # 指定 MyBatis 使用的日志实现,将 SQL 输出到控制台
                log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
                # 一级缓存作用域(SESSION 或 STATEMENT)
                # local-cache-scope: STATEMENT
                # 默认枚举类型处理器(修正为3.4.3.4版本正确路径)
                default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler

            pagehelper:
              #  helperDialect: oracle
              reasonable: true
              params: count=countSql
              # 默认false,当为true时,自动检验适合的数据库
              auto-dialect: mysql
              # 这个一定要加上,不然mysql和oracle分页两个只能用一个,另一个会报错,加上后,两中数据库分页都可以用了
              auto-runtime-dialect: true
              support-methods-arguments: true

            # ===============================================================
            # 自定义日期格式映射配置 (DateFormatConfig.class)
            # ===============================================================
            date-format:
              patterns:
                # 仅日期格式的字段(支持通配符)
                date-only:
                  - birthDate
                  - dischargeDate
                  - availableDate
                  - fillDate
                  - "*Date"        # 通配符:以Date结尾
                  - "*Birth*"      # 通配符:包含Birth
                  - "expire*"      # 通配符:以expire开头
                # 日期时间格式的字段
                date-time:
                  - createTime
                  - updateTime
                  - "*Time"        # 通配符:以Time结尾
                  - "*DateTime"    # 通配符:以DateTime结尾
                  - "start*"       # 通配符:以start开头
                  - "end*"         # 通配符:以end开头
              formats:
                date-only: "yyyy-MM-dd"
                date-time: "yyyy-MM-dd HH:mm:ss"
        d.项目yml扩展配置:nacos 的 jh4j-product-onboard-uat.yml
            server:
              port: 9931
              servlet:
                encoding:
                  # 设置HTTP请求和响应的默认字符编码
                  charset: UTF-8
                  # 启用编码支持
                  enabled: true
                  # 强制对所有请求和响应使用配置的字符编码
                  force: true

            ...... 使用公共,无需再配置

            # ===============================================================
            # 系统配置 (System Configuration)
            # upload 配置
            # ❯ sudo mkdir -p /opt/upload/onboard/{default,attachments}
            # ❯ sudo chown -R $USER:staff /opt/upload/onboard,如 sudo chown -R troyesivens:staff /opt/upload/onboard
            # ❯ sudo chmod -R 775 /opt/upload/onboard
            # ===============================================================
            onboard:
              upload:
                base-path: /opt/upload/onboard           # 根路径:所有biz的一层目录根
                default-biz: default                     # 默认biz名称(未传biz时使用)
                max-file-size: 20                        # 最大文件大小 (MB)
                allowed-file-types: jpg,jpeg,png,gif,webp,svg,pdf,doc,docx,xls,xlsx,ppt,pptx # 允许文件类型
              ejia:
                # eid
                eid: 35315462
                # 基础地址
                base-url: https://e.jggroup.cn/
                # 部门获取地址
                depart-get-url: https://e.jggroup.cn/gateway/openimport/open/dept/getall?accessToken=%s
                # 用户获取地址
                user-get-by-depart-url: https://e.jggroup.cn/gateway/openimport/open/person/getall?accessToken=%s
                # 获取 accessToken 地址
                access-token-url: https://e.jggroup.cn/gateway/oauth2/token/getAccessToken
                # 刷新 accessToken 地址
                refresh-token-url: https://e.jggroup.cn/gateway/oauth2/token/refreshToken
    d.前端:jh4j-product-onboard-ui
        a.dist的index.html
            npm到nginx,通过【npm run build】打包的【dist的index.html】中设置
            reportURL: 'http://localhost:9974/pisces-jimu',
            domianURL: 'http://localhost:9994/pisces-boot',
            根据不同的url,同样需要nginx来设置类似【vite.config.ts】中的【proxy】不同前缀代理
        b.vite.config.ts
            server: {
              hmr: true,
              port: 8001,
              // port: 10002,
              host: "0.0.0.0",

              // 规则一:处理 /dev-api/onboard/ 的请求
              // 目标: http://localhost:9931
              // 特点: 保留 /dev-api 路径前缀
              '/dev-api/onboard/': {
                target: 'http://localhost:9931',
                changeOrigin: true,
                // !!! 注意:这里没有 rewrite 配置 !!!
                // 这将导致请求路径被完整地转发
              },

              // 规则二:处理所有其他的 /dev-api/ 请求(回退到网关)
              // 目标: http://127.0.0.1:9000
              // 特点: 去除 /dev-api 路径前缀
              proxy: {
                "/dev-api": {
                  target: "http://10.70.33.39:9000",    // 晋钢测试ip,来自【npm run dev】显示的【内网IP】
                  // target: "http://127.0.0.1:9000",      // 本地ip,进不去【DEBUG】
                  // target: "http://172.17.8.57:9000",    // 测试服务器,发布
                  rewrite: (p) => p.replace(/^\/dev-api/, ""),
                },
              },
            },
            -------------------------------------------------------------------------------------------------
            环境     ENV变量值    baseApi前缀     说明
            dev      "dev"      "/dev-api"      开发调试/本地测试专用
            prod     "prod"     "/prod-api"     线上正式环境接口,用户真实访问
            uat      "uat"      "/uat-api"      预发布或验收测试环境,专用于上线前验证
            -------------------------------------------------------------------------------------------------
            环境变量通过 loadEnv(mode, process.cwd(), "ENV") 加载,接着 baseApi 被赋值为 "/" + config["ENV"] + "-api"
            如果 config["ENV"](即 ENV 环境变量)为 "dev" 且执行 build 流程,则 baseApi = "/uat-api"(即特殊处理上线预发条件)
            其它情况下,dev 环境的前缀就是 "/dev-api",prod 环境就是 "/prod-api"(源码拼接结果)
        c.src/util/pages.ts
            export const getPages = function (): { component: string; label: string }[] {
              const ret = [
                // ------------------------------------------入职管理--------------------------------------
                {
                  name: "onboard/onbApplicant/index",
                  label: "应聘登记",
                },
                {
                  name: "onboard/onbAllocate/index",
                  label: "面试分配",
                },
                {
                  name: "onboard/onbEvaluate/index",
                  label: "面试评估",
                },
                {
                  name: "onboard/onbOffer/index",
                  label: "面试录用",
                },
                {
                  name: "onboard/onbEvaluateApply/index",
                  label: "评估审批",
                },
                {
                  name: "onboard/onbOfferApply/index",
                  label: "录用审批",
                },
                {
                  name: "onboard/onbOrgPersonInfo/index",
                  label: "组织人员",
                },
                {
                  name: "onboard/onbPostionJob/index",
                  label: "组织岗位",
                },
              ]

              return ret as any
            }
        c.示例(应聘登记):onboard/onbApplicant/index
            # 文件:src/api/action.ts
            import request from '@jhlc/common-core/src/util/request';
            /**
             * CRUD action
             */
            export const getAction = (url, param) => {
              return request({
                url: url,
                method: 'get',
                params: param
              });
            };
            -------------------------------------------------------------------------------------------------
            # 文件:src/views/onboard/onbApplicant/js/index.js
            export default {
              name: 'onbApplicant',

              data() {
                const baseUrl = '/dev-api';

                return {
                  // 请求路径:枚举
                  sysAttrListUrl: baseUrl + '/onboard/attr/list', // GET请求
                  // 请求路径:主表
                  applicantListUrl: baseUrl + '/onboard/applicant/person/list', // POST请求
                  applicantDetailUrl: baseUrl + '/onboard/applicant/person/detail', // POST请求
                  applicantInsertUrl: baseUrl + '/onboard/applicant/person/insert', // POST请求
                  applicantUpdateUrl: baseUrl + '/onboard/applicant/person/update', // POST请求
                  applicantDeleteUrl: baseUrl + '/onboard/applicant/person/delete', // POST请求
                  applicantDeleteBatchUrl: baseUrl + '/onboard/applicant/person/deleteBatch', // POST请求 批量删除/恢复
                  applicantExportUrl: baseUrl + '/onboard/applicant/person/export', // POST请求
                };
              },
            };

3 入职管理平台

3.1 需求沟通

01.应聘登记A表,应聘者录入
    a.开始
        应聘单位:
        应聘组别:
        应聘岗位:
        -----------------------------------------------------------------------------------------------------
        附件1:身份证
        附件2:学位证
        附件3:毕业证
        附件4:学历证书电子注册备案表
        附件5:毕业证在线验证报告
    b.基本信息
        姓名:
        照片:
        性别:
        出生年月:
        民族:
        政治面貌:党员 / 团员 / 群众
        婚姻状况:已婚 / 未婚
        -----------------------------------------------------------------------------------------------------
        身高:XX厘米
        体重:XXX公斤
        视力:左:1.0、右:1.0
        血型:
        职称:
        外语等级:
        -----------------------------------------------------------------------------------------------------
        联系电话:
        身份证号:
        可报到时间:
        是否退役军人:是 / 否
        退役时间:
        退役证编号:
        -----------------------------------------------------------------------------------------------------
        籍贯:XX省 XX市 XX县(区)
        现家庭住址:XX省 XX市 XX县(区) XX乡(街道) XX村(路) XX号
        户口所在地:XX省 XX市 XX县(区) XX乡(街道) XXXXXXXXXXXX派出所
    c.工作经历
        起止时间                    曾工作单位(全称)       职务           负责业务范围         证明人及联系方式
        XXXX年XX月 至 XXXX年XX月
        XXXX年XX月 至 XXXX年XX月
        XXXX年XX月 至 XXXX年XX月
        XXXX年XX月 至 XXXX年XX月
    d.培训经历
        培训时间                    受何培训(或培训名称)    获得何资格/技能等级
        XXXX年XX月 至 XXXX年XX月
        XXXX年XX月 至 XXXX年XX月
        XXXX年XX月 至 XXXX年XX月
        XXXX年XX月 至 XXXX年XX月
    e.家庭情况
        姓名                       与本人关系              年龄           工作单位             联系电话
        XXX                       父亲/母亲
        XXX                       哥哥/弟弟
        XXX                       姐姐/妹妹
    f.学习经历
        起止时间  学历               学校名称               专业           学校学历性质
        XXXX年XX月 至 XXXX年XX月
        XXXX年XX月 至 XXXX年XX月
        XXXX年XX月 至 XXXX年XX月
    g.疾病史别
        过往史:传染病、过敏史、手术史、其它
        现在史:残疾、心理病、色盲、恐高、晕高、癫痫、其它
        家族史:心脏病、高血压、糖尿病、其它
        职业史:耳鼻喉、肺肝腰、其它
        其他史:
        无病史需手写:本人无任何病史____________
    h.备注
        应聘途径:网站______、微信/朋友推荐/社会招聘会/校园招聘会/其他
        1.是否同意担任轮班工作:是/否
        2.是否需住宿:是/否,说明:因宿舍房间有限,恕无法保证均能获得分配。
    i.申明
        1.本人声明上述资料所填皆属真实、准确,且本人无吸毒、偷盗、赌博、扰乱公共秩序等行为,
        如有查证必要时,本人授权同意山西晋城钢铁控股集团有限公司依据个人信息保护法之规定,
        向相关单位、部门或公司查询本人之相关资料,如有不实,本人愿意接受(不雇佣)之处理。
        2.若经贵公司录用,悉接受分发工作单位绝无异议,入职后同意缴纳社会保险,
        且于报到后若有发现体检表上所未记载而属不适应工作之疾病,愿即接受(不雇用)之处理。
        3.本人签字:
        4.填表时间:XXXX年XX月XX日

02.应聘登记B表,文员反馈【面试结果】
    a.基本信息
        a.分类1
            应聘人:
            应聘岗位:
            应聘职级:
        b.分类2
            定编:
            缺员:
    b.用人单位结构面试(Y6)
        a.测试方式
            笔试 / 口试 / 实际操作
        b.基础素质
            a.学历水平
                高中 1分
                中专 3分
                专科 5分
                本科 7分
                硕士 10分
            b.专业匹配
                1分 / 3分 / 5分 / 7分 / 10分
        c.专业深度
            a.理论知识
                1分 / 3分 / 5分 / 7分 / 10分
            b.实务经验
                1分 / 3分 / 5分 / 7分 / 10分
        d.经验匹配
            a.行业经验
                0~2年   1分
                3年      3分
                4年      5分
                5年      7分
                6年及以上 10分
        e.综合素质
            a.目标管理
                1分 / 3分 / 5分 / 7分 / 10分
            b.计划管理
                1分 / 3分 / 5分 / 7分 / 10分
            c.组织管理
                1分 / 3分 / 5分 / 7分 / 10分
            d.绩效管理
                1分 / 3分 / 5分 / 7分 / 10分
            e.性格管理
                1分 / 3分 / 5分 / 7分 / 10分
        f.其他信息
            a.是否录用
                是 / 否
            b.试用期
                一个月 / 二个月 / 三个月 / 六个月
            c.综合分
                XX分
    c.用人单位结构面试
        a.测试方式
            笔试 / 口试 / 实际操作
        b.专业技能
            a.专业知识
                1分 / 3分 / 5分 / 7分 / 10分
            b.实操技能
                1分 / 3分 / 5分 / 7分 / 10分
        c.基本素质
            a.精神面貌
                1分 / 3分 / 5分 / 7分 / 10分
            b.吃苦耐劳
                1分 / 3分 / 5分 / 7分 / 10分
            c.沟通表达
                1分 / 3分 / 5分 / 7分 / 10分
        d.经验匹配
            a.行业经验
                0~1年    1分
                2年      2分
                3年      3分
                4年      4分
                5年      5分
            b.经验分
                XX分
        e.其他信息
            a.用工性质
                一般普工 / 一般技工 / 熟练技工
            b.是否录用
                是 / 否
            c.试用期
                一个月 / 二个月 / 三个月 / 六个月
            d.综合分
                XX

3.2 系统设计

01.逻辑外键
    a.分类1
        CREATE TABLE `onb_applicant` (
          `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '主键ID (UUID)',
        CREATE TABLE `onb_applicant_train` (
          `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '主键ID (UUID)',
          `applicant_id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '应聘者ID (逻辑外键)',
        CREATE TABLE `onb_applicant_work` (
          `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '主键ID (UUID)',
          `applicant_id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '应聘者ID (逻辑外键)',
    b.分类2
        CREATE TABLE `onb_interview_evaluation` (
          `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '主键ID (UUID)',
          `applicant_id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '应聘者ID (逻辑外键)',
          `applicant_position_id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '应聘岗位ID (逻辑外键)',
    c.分类3
        CREATE TABLE `onb_interview_evaluation_apply` (
          `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '主键ID (UUID)',
          `interview_evaluation_id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '面试评估id (逻辑外键)',
          `flow_title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '流程标题',
    d.分类4
        CREATE TABLE `onb_interview_evaluation_type_a` (
          `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '主键ID (UUID)',
          `applicant_id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '应聘者ID (逻辑外键)',
          `applicant_position_id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '应聘岗位ID (逻辑外键)',
          `interview_evaluation_id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '面试评估ID (逻辑外键)',

02.数据库设计
    a.数据结构
        主键:ID无法自动填充
        主键:32位/36位,int/long/string,最终选择string(36)
        标志位:open_flag/delete_flag,tinyint/string(6),最终选择string(6)
        -----------------------------------------------------------------------------------------------------
        create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
        create_user varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建人',
        update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
        update_user varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新人',
        deleted_flag tinyint(1) NOT NULL DEFAULT '0' COMMENT '删除标志(0-未删除, 1-已删除)',
    b.自定义结构
        JsonObjectTypeHandler.java -> PastHistoryTypeHandler.java
        past_history:{"infectious":true,"allergy":true,"surgery":false,"other":false}
        -----------------------------------------------------------------------------------------------------
        JsonObjectTypeHandler.java -> AddressTypeHandler.java
        home_address,{"province":"","city":"","district":"","detail":"","police":"","village":"","street":"","number":""}
        -----------------------------------------------------------------------------------------------------
        JsonArrayTypeHandler.java -> ApplicationChannelsHandler.java
        application_channels:["网站","校园招聘会","朋友推荐","微信","社会招聘会"]
    c.常量、枚举与字典表
        常量保存简单的KV,枚举属于java程序逻辑,映射属于sql主数据维护
        -----------------------------------------------------------------------------------------------------
        枚举映射:OnbMapEnum.java、OnbStringKeyMapEnum.java,项目启动自动序列化(OnbTypeHandlerAutoConfig.java)
        字典映射:sys_dict_item,包括dict_code、dict_name、item_id、item_text、sort_no
    d.对接三方信息表
        岗位映射:sys_position_job,包括dept_no、dept_name、position_no、position_name、open_flag
        用户映射:sys_person_info,包括org_name、org_no、company_id、org_level、date_steward、date_steward_no、oepn_flag
        -----------------------------------------------------------------------------------------------------
        使用编码:sys_person_info、sys_position_job,在onb_applicant选择【人、岗位】使用【三方表】的编码
        冗余字段:apply_position,在onb_applicant更新后,onb_interview_position也需要更新,因为这个字段2个表都在用,要保持一致性
    e.对接三方审批表
        1.用户登录验证                            @CheckSign
        2.角色权限验证(支持 OR/AND 逻辑)          @CheckSign(roles = {"ROLE_HR_ADMIN", "ROLE_MANAGER"})
        3.权限编码验证(支持 OR/AND 逻辑)          @CheckSign(permissions = {"onboard:allocate:update"})
        4.组织权限验证(两层验证:管理员 > 数据管家)  @CheckSign(checkOrgAdmin = true)
        -----------------------------------------------------------------------------------------------------
        用户映射:sys_person_info,包括org_name、org_no、company_id、org_level、date_steward、date_steward_no、oepn_flag

02.后端设计
    a.MyBatisPlus
        分页
        
        -----------------------------------------------------------------------------------------------------
        
    
    
    b.

    e.对接三方权限表
    
    枚举序列化、

    MyBatis:自动填充、分页

    问题汇总:get(0)
    小程序暂存:标志2、pinia


codebase工程


01.描述
    映射:1与'1'
    网关:图片正则
    权限:前后端接入
    序列化:枚举、Date
    URL:.env与vite混用去

mybatisplus配置

版本号
封装axios、拦截器、网关(图片正则 乱码)


mini小程序,输入防抖问题 setData,光标一直回退

01.custom-class
    a.问题根因
        Element Plus 2.4.0 是一个破坏性变更的分水岭
        custom-class prop 被完全移除
        改为使用 Vue 3 的标准 class 属性继承机制
    b.解决方案
        2.2.6:使用 custom-class="xxx"
        2.9.7:使用 class="xxx" 或专用的 *-class props
    c.你的项目
        当前版本 2.2.6 → custom-class ✅ 正确
        如果升级到 2.9.7 → 必须改用 class
    d.要点整理
        版本限制:项目固定在 [email protected],此版本仍支持 custom-class 属性。
        问题根因:el-dialog 使用 Teleport 挂载到 body,而页面样式文件被 <style scoped> 限制,导致 .approval-dialog 样式偶尔失效。
        解决策略:保留 custom-class="approval-dialog",同时将相关样式设为全局(移除 scoped、或改用 :deep()),确保 Teleport 元素可以匹配到样式。
    e.结论与建议
        已确认官方文档与 Issue:custom-class 在 2.4.0 才会移除,目前版本可继续使用。
        样式需要全局化:改为 <style src="./css/index.css"> 或者使用 :deep(.approval-dialog)。
        可考虑把审批对话框样式集中到共享 CSS,便于维护。

                  <el-button
                    type="text"
                    size="small"
                    @click="tableActions.handleDetail(scope.row)"
                    >详情
                  </el-button>

                  <el-button
                    v-if="canPerform('notify')"
                    type="primary"
                    link
                    size="small"
                    :disabled="!canAudit(scope.row.auditStatus)"
                    @click="fun_audit(scope.row)"
                    >通知
                  </el-button>
                  
                  
                  primary的type有问题


3.3 后端设计

01.目录结构
    a.人员信息
        组织架构管理:与其他模块数据一致,需要每天同步
        人员基础信息管理:与其他模块数据一致,需要每天同步
    b.招聘管理
        应聘登记
        面试评估
        录用反馈

02.通用界面
    a.字段
        学历
        状态
        时间(倒序)
        审核状态:待分配(默认)-> 面试中 -> 面试失败/面试成功 -> 待入职 / 面试违规
        -----------------------------------------------------------------------------------------------------
        操作:审批 / 编辑 / 删除
        弹框:发起 / 保存 / 取消
    b.权限
        用户管理员:人力6人
        普通管理员(用户):绑定Y6-李敏,J047813
    c.功能1
        增删改查
        导出

03.审核流程
    a.第1步:应聘者录入                                                         --扫码
        晋钢轻云办
        -> 招聘
        -> 应聘登记表
        -> 表单,跟【应聘登记】界面中【新增功能】一致
    b.第2步:人力资源中心(6人),进行【分配】                                      --用户管理员
        应聘登记
        -> 多选:2、3、5
        -> 点击【分配】按钮
        -> 弹框详情:
            1.部门 W1/Y6,一级单位
            2.分配人:李敏
        -> 【保存/通知/取消】
            1.调用【通知,并非工作流】:晋钢ejia -> 抛给Y6李敏,通知消息(人力资源已分配XX、XX参加面试)
            2.回调成功:审核状态(待分配 -> 面试中),隐藏2个字段,字段1(一级分配部门),字段2(暂定)
    c.第3步:面试中
        1.【系统指定】分配给【李敏】,从【研发中心】带人来【管控中心】,进行Y6面试
        2.【各个厂处】内部指定【面试官】,对【应聘者】进行【机试+笔试】
        3.【面试官】反馈给【李敏】
    d.第4步:李敏,进行【录入】                                                   --普通管理员(用户)
        1.登录 -> 没有【新增改】,只能看到【分配的3条数据】
        2.点击【反馈】按钮,弹框详情如下:
            2.1.面试结果:状态(录用/不录用)
            2.2.面试建议:XXX
            2.3.应聘岗位:XXX(下拉框,一级部门 -> 每个部门的岗位信息)
        3.录用:按钮【保存/发起/取消】
            3.1.保存
                3.1.1.暂存数据
            3.2.发起
                3.2.1.审核状态:待分配 -> 面试中
                3.2.2.发起ejia审批
                      名称(XX应聘结果审批)
                      发起人:李敏
                      审批人1:李敏(暂定)
                      审批人2:由前一级审批人(李敏),来指定对应【二级主管】
                      审批人3:李敏的一级主管(该一级主管可直接找到)
                      审批状态:面试中 -> 面试成功
            3.2.取消
                3.1.1.取消弹框
        4.不录用:按钮【保存/取消】
            4.1.保存
                4.1.1.由人力再去决定【应聘哪个岗位】,分配人【从李敏变成NULL】
            4.2.取消
                4.1.1.取消弹框
    e.第5步:人力资源中心(6人),进行【补录】                                      --用户管理员
        1.登录 -> 有【新增改】,可以看到【面试成功】的【3条数据】
        2.操作【张三】
        3.点击【编辑】按钮,弹框详情如下:
            3.1.状态:录用
            3.2.试用期工资:XXX
            3.3.试用期时长:1个月/2个月/3个月
            3.4.转正工资:XXXX
            3.5.用工性质:一般普工/一般技工/熟练技工
        4.点击【审批】按钮,发起ejia审批
            名称(XX录用结果审批)
            发起人:HR(用户管理员)
            审批人1:王海英(人资处长)
            审批人2:王海英的一级主管(该一级主管可直接找到)
            审批人3:詹总
            审批状态:面试成功 -> 待入职
    f.附:定时操作
        a.待分配
            说明:3天内,应聘者未到指定地点参与应聘
            状态:待分配 -> 面试违规
        b.待分配 -> 面试中
            说明:3天内,面试失败
            状态:待分配 -> 面试中 -> 面试违规
        c.待入职
            说明:需要同步这部分数据到【ERP】
            状态:同步操作

3.4 前端设计

00.整体框架
    a.风格:上中下
        筛选框+多个按钮(查询、重置、新增)
        表格:列1、列2、列3、列4,操作1:XX、XX、XX,操作2:XX
        分页组件
    b.弹框1:普通表单(单列/多列,自动根据字段多少来确定)
        字段1:值1
        字段2:值2
        字段3:值3
    c.弹框2:有多个标签页,每个标签页都有表单(单列/多列,自动根据字段多少来确定) / 表格(子表,完整的增删改查)
        标签页1
        字段1:值1    字段4:值1
        字段2:值2    字段5:值2
        字段3:值3    字段6:值2
        标签页2
        字段1:值1    字段4:值1
        字段2:值2    字段5:值2
        字段3:值3    字段6:值2
        标签页3
        字段1:值1    字段4:值1
        字段2:值2    字段5:值2
        字段3:值3    字段6:值2

01.应聘登记
    a.区域1:筛选框
        姓名
        性别(1-男、2-女)
        出生日期
        联系电话
        身份证号
        政治面貌(1-党员、2-团员、3-群众)
        外语等级(1-一般、2-四级、3-六级、4-专四、5-专八、6-托福、7-雅思)
        应聘岗位
        审核状态(1-待分配、2-等待面试)
        分配人
        报到时间
        面试时间
    b.区域2:表格
        姓名
        照片
        性别
        出生日期
        联系电话
        身份证号
        应聘岗位
        审核状态(1-待分配、2-等待面试)
        分配人
        报到时间
        面试时间
        -----------------------------------------------------------------------------------------------------
        操作1:详情、编辑、删除
        操作2:分配、审核、撤回审核
    c.区域2:操作1:详情/编辑(仅仅表单共用)
        标题:详情/编辑
        -----------------------------------------------------------------------------------------------------
        标签页1:基本情况
        以下是表单(多列)
        applicant_name          姓名
        apply_position          应聘岗位
        photo_url               照片URL
        gender                  性别(1-男、2-女)
        birth_date              出生日期
        nation                  民族
        political_status        政治面貌(1-党员、2-团员、3-群众)
        marital_status          婚姻状况(1-已婚、2-未婚)
        height                  身高(厘米)
        weight                  体重(公斤)
        vision_left             左眼视力
        vision_right            右眼视力
        blood_type              血型(1-A型、2-B型、3-AB型、4-O型)
        professional_title      职称
        foreign_language_level  外语等级(1-一般、2-四级、3-六级、4-专四、5-专八、6-托福、7-雅思)
        foreign_language_score  外语分数
        contact_phone           联系电话
        id_card_no              身份证号
        available_date          可报到时间
        is_veteran              是否退役军人(0-否、1-是)
        discharge_date          退役时间
        discharge_cert_no       退役证编号
        home_address            现家庭住址
        household_register      户口所在地
        native_place            籍贯
        -----------------------------------------------------------------------------------------------------
        标签页2:工作经历
        以下是表格(多列)
        start_date              开始时间
        end_date                结束时间
        company_name            曾工作单位全称
        position                职务
        business_scope          负责业务范围
        reference_person        证明人
        reference_contact       证明人的联系方式
        操作:编辑、删除
        -----------------------------------------------------------------------------------------------------
        标签页3:培训经历
        以下是表格(完整增删改查)
        按钮:新增
        start_date    培训开始时间
        end_date      培训结束时间
        training_name 受何培训/培训名称
        qualification 获得何资格/技能等级
        操作:编辑、删除
        -----------------------------------------------------------------------------------------------------
        标签页4:家庭情况
        以下是表格(完整增删改查)
        按钮:新增
        name                    姓名
        relationship            与本人关系
        age                     年龄
        work_unit               工作单位
        contact_phone           联系电话
        操作:编辑、删除
        -----------------------------------------------------------------------------------------------------
        标签页5:学习经历
        以下是表格(完整增删改查)
        按钮:新增
        start_date              开始时间
        end_date                结束时间
        education_level         学历
        school_name             学校名称
        major                   专业
        school_nature           学校/学历类型
        操作:编辑、删除
        -----------------------------------------------------------------------------------------------------
        标签页6:病史类别
        past_history            过往史
        current_history         现在史
        family_history          家族史
        occupational_history    职业史
        other_history           其他史
        no_history_statement    无病史声明
        -----------------------------------------------------------------------------------------------------
        标签页7:附件信息
        以下是5个上传文件的组件,每个组件支持上传、删除、更换
        分别有1-身份证、2-学位证、3-毕业证、4-学历证书电子注册备案表、5-毕业证在线验证报告
        -----------------------------------------------------------------------------------------------------
        标签页8:备注
        应聘途径(多选):网站、微信、朋友推荐、社会招聘会、校园招聘会、其他
        是否同意轮班工作(单选):是、否
        是否需要住宿(单选):是、否
        住宿说明:因宿舍房间有限,恕无法保证均能获得分配
        -----------------------------------------------------------------------------------------------------
        标签页9:申明
        声明内容:*本人声明上述资料所填皆属真实、准确,且本人无吸毒、偷盗、赌博、扰乱公共秩序等行为,如有查证必要时,本人授权同意山西晋城钢铁控股集团有限公司依据个人信息保护法之规定,向相关单位、部门或公司查询本人之相关资料,如有不实,本人愿意接受(不雇佣)之处理。
                *若经贵公司录用,悉接受分发工作单位绝无异议,入职后同意缴纳社会保险,且于报到后若有发现体检表上所未记载而属不适应工作之疾病,愿即接受(不雇用)之处理。
        本人签字:
        填表时间:
    d.区域2:操作1:删除
        标题:删除确认
        -----------------------------------------------------------------------------------------------------
        说明:确认删除该XXX吗?此操作不可撤销!
        按钮1:取消
        按钮2:确认删除
    e.区域2:操作2:分配
        标题:分配面试
        -----------------------------------------------------------------------------------------------------
        应聘者:XX          applicantId
        应聘岗位:XX        applyPosition
        分配人:XX          assignedUser
        分配部门:XX        assignedDept
        分配说明:XX        assignedReason
        -----------------------------------------------------------------------------------------------------
        按钮1:取消
        按钮2:保存
    f.区域2:操作2:审核
        弹出确认框,发出POST请求
    g.区域2:操作2:撤回审核
        弹出确认框,发出POST请求
    h.区域3:分页组件
        共19条  10条/页  1 2 3 ... 前往X页

02.面试评估
    a.区域1:筛选框
        姓名
        性别(1-男、2-女)
        出生日期
        联系电话
        身份证号
        政治面貌(1-党员、2-团员、3-群众)
        外语等级(1-一般、2-四级、3-六级、4-专四、5-专八、6-托福、7-雅思)
        应聘岗位
        审核状态(3-面试审核中、4-面试通过、5-面试失败)
        分配人
        报到时间
        面试时间
    b.区域2:表格
        姓名
        照片
        性别
        出生日期
        联系电话
        身份证号
        应聘岗位
        审核状态(3-面试审核中、4-面试通过、5-面试失败)
        分配人
        报到时间
        面试时间
        -----------------------------------------------------------------------------------------------------
        操作1:详情、编辑、删除
        操作2:评估、审核、撤回审核
    c.区域2:操作1:详情/编辑(仅仅表单共用)
        标题:详情/编辑
        -----------------------------------------------------------------------------------------------------
        标签页1:基本情况
        以下是表单(多列)
        applicant_name          姓名
        apply_position          应聘岗位
        photo_url               照片URL
        gender                  性别(1-男、2-女)
        birth_date              出生日期
        nation                  民族
        political_status        政治面貌(1-党员、2-团员、3-群众)
        marital_status          婚姻状况(1-已婚、2-未婚)
        height                  身高(厘米)
        weight                  体重(公斤)
        vision_left             左眼视力
        vision_right            右眼视力
        blood_type              血型(1-A型、2-B型、3-AB型、4-O型)
        professional_title      职称
        foreign_language_level  外语等级(1-一般、2-四级、3-六级、4-专四、5-专八、6-托福、7-雅思)
        foreign_language_score  外语分数
        contact_phone           联系电话
        id_card_no              身份证号
        available_date          可报到时间
        is_veteran              是否退役军人(0-否、1-是)
        discharge_date          退役时间
        discharge_cert_no       退役证编号
        home_address            现家庭住址
        household_register      户口所在地
        native_place            籍贯
        -----------------------------------------------------------------------------------------------------
        标签页2:工作经历
        以下是表格(多列)
        start_date              开始时间
        end_date                结束时间
        company_name            曾工作单位全称
        position                职务
        business_scope          负责业务范围
        reference_person        证明人
        reference_contact       证明人的联系方式
        操作:编辑、删除
        -----------------------------------------------------------------------------------------------------
        标签页3:培训经历
        以下是表格(完整增删改查)
        按钮:新增
        start_date    培训开始时间
        end_date      培训结束时间
        training_name 受何培训/培训名称
        qualification 获得何资格/技能等级
        操作:编辑、删除
        -----------------------------------------------------------------------------------------------------
        标签页4:家庭情况
        以下是表格(完整增删改查)
        按钮:新增
        name                    姓名
        relationship            与本人关系
        age                     年龄
        work_unit               工作单位
        contact_phone           联系电话
        操作:编辑、删除
        -----------------------------------------------------------------------------------------------------
        标签页5:学习经历
        以下是表格(完整增删改查)
        按钮:新增
        start_date              开始时间
        end_date                结束时间
        education_level         学历
        school_name             学校名称
        major                   专业
        school_nature           学校/学历类型
        操作:编辑、删除
        -----------------------------------------------------------------------------------------------------
        标签页6:病史类别
        past_history            过往史
        current_history         现在史
        family_history          家族史
        occupational_history    职业史
        other_history           其他史
        no_history_statement    无病史声明
        -----------------------------------------------------------------------------------------------------
        标签页7:附件信息
        以下是5个上传文件的组件,每个组件支持上传、删除、更换
        分别有1-身份证、2-学位证、3-毕业证、4-学历证书电子注册备案表、5-毕业证在线验证报告
        -----------------------------------------------------------------------------------------------------
        标签页8:备注
        应聘途径(多选):网站、微信、朋友推荐、社会招聘会、校园招聘会、其他
        是否同意轮班工作(单选):是、否
        是否需要住宿(单选):是、否
        住宿说明:因宿舍房间有限,恕无法保证均能获得分配
        -----------------------------------------------------------------------------------------------------
        标签页9:申明
        声明内容:*本人声明上述资料所填皆属真实、准确,且本人无吸毒、偷盗、赌博、扰乱公共秩序等行为,如有查证必要时,本人授权同意山西晋城钢铁控股集团有限公司依据个人信息保护法之规定,向相关单位、部门或公司查询本人之相关资料,如有不实,本人愿意接受(不雇佣)之处理。
                *若经贵公司录用,悉接受分发工作单位绝无异议,入职后同意缴纳社会保险,且于报到后若有发现体检表上所未记载而属不适应工作之疾病,愿即接受(不雇用)之处理。
        本人签字:
        填表时间:
    d.区域2:操作1:删除
        标题:删除确认
        -----------------------------------------------------------------------------------------------------
        说明:确认删除该XXX吗?此操作不可撤销!
        按钮1:取消
        按钮2:确认删除
    e.区域2:操作2:评估
        标题:评估
        -----------------------------------------------------------------------------------------------------
        以下是表单(多列)
        applicant_name          姓名
        gender                  性别(1-男、2-女)
        birth_date              出生日期
        contact_phone           联系电话
        id_card_no              身份证号
        applyPosition           应聘岗位
        请选择评估类型:A类型/B类型
        -----------------------------------------------------------------------------------------------------
        根据【请选择评估类型:A类型/B类型】来【显示/隐藏】,下面是 Y6结构面试评估 (A类型)
        基础素质评估
            学历水平 1分3分5分7分10分 高中1分,中专3分,专科5分,本科7分,硕士10分
            专业匹配 1分3分5分7分10分 专业匹配度评估
        专业深度评估
            理论知识 1分3分5分7分10分 专业理论掌握程度
            实务经验 1分3分5分7分10分 实际工作经验
        经验匹配评估
            行业经验 1分3分5分7分10分 0-2年1分,3年3分,4年5分,5年7分,6年以上10分
        综合素质评估
            目标管理 1分3分5分7分10分 目标设定和执行能力
            计划管理 1分3分5分7分10分 计划制定和管理能力
            组织管理 1分3分5分7分10分 组织协调能力
            绩效管理 1分3分5分7分10分 绩效管理能力
            性格管理 1分3分5分7分10分 性格适应性
        总分
            XXX
        -----------------------------------------------------------------------------------------------------
        根据【请选择评估类型:A类型/B类型】来【显示/隐藏】,下面是 用人单位结构面试评估 (B类型)
        专业技能评估
            专业知识 1分3分5分7分10分 专业知识掌握程度
            实操技能 1分3分5分7分10分 实际操作技能
        综合素质评估
            精神状态 1分3分5分7分10分 精神面貌和状态
            吃苦耐劳 1分3分5分7分10分 工作态度和耐力
            沟通协调 1分3分5分7分10分 沟通协调能力
            工作经验 1分3分5分7分10分 相关工作经验
        用工类型
            用工类型 ○正式员工 ○劳务派遣 ○临时工 ○实习生
        总分
            XXX
        -----------------------------------------------------------------------------------------------------
        测试方式:                1-笔试、2-口试、3-实际操作              test_method
        用工性质:                1-一般普工、2-一般技工、3-熟练技工       employment_type
        面试结果:                通过/不通过(可以更改)
        面试意见:                XXX(可以更改)
        按钮1:取消
        按钮2:保存
    f.区域2:操作2:审核
        弹出确认框,发出POST请求
    g.区域2:操作2:撤回审核
        弹出确认框,发出POST请求
    h.区域3:分页组件
        共19条  10条/页  1 2 3 ... 前往X页

03.录用反馈
    a.区域1:筛选框
        姓名
        性别(1-男、2-女)
        出生日期
        联系电话
        身份证号
        政治面貌(1-党员、2-团员、3-群众)
        外语等级(1-一般、2-四级、3-六级、4-专四、5-专八、6-托福、7-雅思)
        应聘岗位
        审核状态(3-面试审核中、4-面试通过、5-面试失败)
        分配人
        报到时间
        面试时间
    b.区域2:表格
        姓名
        照片
        性别
        出生日期
        联系电话
        身份证号
        应聘岗位
        审核状态(3-面试审核中、4-面试通过、5-面试失败)
        分配人
        报到时间
        面试时间
        -----------------------------------------------------------------------------------------------------
        操作1:详情、编辑、删除
        操作2:录用、审核、撤回审核
    c.区域2:操作1:详情/编辑(仅仅表单共用)
        标题:详情/编辑
        -----------------------------------------------------------------------------------------------------
        标签页1:基本情况
        以下是表单(多列)
        applicant_name          姓名
        apply_position          应聘岗位
        photo_url               照片URL
        gender                  性别(1-男、2-女)
        birth_date              出生日期
        nation                  民族
        political_status        政治面貌(1-党员、2-团员、3-群众)
        marital_status          婚姻状况(1-已婚、2-未婚)
        height                  身高(厘米)
        weight                  体重(公斤)
        vision_left             左眼视力
        vision_right            右眼视力
        blood_type              血型(1-A型、2-B型、3-AB型、4-O型)
        professional_title      职称
        foreign_language_level  外语等级(1-一般、2-四级、3-六级、4-专四、5-专八、6-托福、7-雅思)
        foreign_language_score  外语分数
        contact_phone           联系电话
        id_card_no              身份证号
        available_date          可报到时间
        is_veteran              是否退役军人(0-否、1-是)
        discharge_date          退役时间
        discharge_cert_no       退役证编号
        home_address            现家庭住址
        household_register      户口所在地
        native_place            籍贯
        -----------------------------------------------------------------------------------------------------
        标签页2:工作经历
        以下是表格(多列)
        start_date              开始时间
        end_date                结束时间
        company_name            曾工作单位全称
        position                职务
        business_scope          负责业务范围
        reference_person        证明人
        reference_contact       证明人的联系方式
        操作:编辑、删除
        -----------------------------------------------------------------------------------------------------
        标签页3:培训经历
        以下是表格(完整增删改查)
        按钮:新增
        start_date    培训开始时间
        end_date      培训结束时间
        training_name 受何培训/培训名称
        qualification 获得何资格/技能等级
        操作:编辑、删除
        -----------------------------------------------------------------------------------------------------
        标签页4:家庭情况
        以下是表格(完整增删改查)
        按钮:新增
        name                    姓名
        relationship            与本人关系
        age                     年龄
        work_unit               工作单位
        contact_phone           联系电话
        操作:编辑、删除
        -----------------------------------------------------------------------------------------------------
        标签页5:学习经历
        以下是表格(完整增删改查)
        按钮:新增
        start_date              开始时间
        end_date                结束时间
        education_level         学历
        school_name             学校名称
        major                   专业
        school_nature           学校/学历类型
        操作:编辑、删除
        -----------------------------------------------------------------------------------------------------
        标签页6:病史类别
        past_history            过往史
        current_history         现在史
        family_history          家族史
        occupational_history    职业史
        other_history           其他史
        no_history_statement    无病史声明
        -----------------------------------------------------------------------------------------------------
        标签页7:附件信息
        以下是5个上传文件的组件,每个组件支持上传、删除、更换
        分别有1-身份证、2-学位证、3-毕业证、4-学历证书电子注册备案表、5-毕业证在线验证报告
        -----------------------------------------------------------------------------------------------------
        标签页8:备注
        应聘途径(多选):网站、微信、朋友推荐、社会招聘会、校园招聘会、其他
        是否同意轮班工作(单选):是、否
        是否需要住宿(单选):是、否
        住宿说明:因宿舍房间有限,恕无法保证均能获得分配
        -----------------------------------------------------------------------------------------------------
        标签页9:申明
        声明内容:*本人声明上述资料所填皆属真实、准确,且本人无吸毒、偷盗、赌博、扰乱公共秩序等行为,如有查证必要时,本人授权同意山西晋城钢铁控股集团有限公司依据个人信息保护法之规定,向相关单位、部门或公司查询本人之相关资料,如有不实,本人愿意接受(不雇佣)之处理。
                *若经贵公司录用,悉接受分发工作单位绝无异议,入职后同意缴纳社会保险,且于报到后若有发现体检表上所未记载而属不适应工作之疾病,愿即接受(不雇用)之处理。
        本人签字:
        填表时间:
    d.区域2:操作1:删除
        标题:删除确认
        -----------------------------------------------------------------------------------------------------
        说明:确认删除该XXX吗?此操作不可撤销!
        按钮1:取消
        按钮2:确认删除
    e.区域2:操作2:录用
        标题:录用
        -----------------------------------------------------------------------------------------------------
        以下是表单(多列)
        applicant_name          姓名
        gender                  性别(1-男、2-女)
        birth_date              出生日期
        contact_phone           联系电话
        id_card_no              身份证号
        applyPosition           应聘岗位
        -----------------------------------------------------------------------------------------------------
        状态                     录用/不录用(可以更改)
        试用期工资                XXX(可以更改)
        试用期时长                1个月/2个月/3个月(可以更改)
        转正工资                  XXXX
        -----------------------------------------------------------------------------------------------------
        按钮1:取消
        按钮2:保存
    f.区域2:操作2:审核
        弹出确认框,发出POST请求
    g.区域2:操作2:撤回审核
        弹出确认框,发出POST请求
    h.区域3:分页组件
        共19条  10条/页  1 2 3 ... 前往X页