【项目想法】在线简历制作

想法:

希望打造一款能够在线简历模板,通过后台管理系统配置相关JSON数据,即可生成一套美观程序员简历。 感兴趣的可以给个关注,后期上线后可以开放第一时间知会

计划进程:

  1. 开发模板,优先支持移动端样式布局
  2. 支持后台管理系统配置简历内容
  3. 模板支持PC端样式布局兼容
  4. 扩展模板+扩展配置内容+后台管理系统能够预览在线简历效果
  5. 通过配置生成,直接对外提供在线简历资源包,让用户能够轻松部署完成自己的在线简历

技术栈:

Taro+React绘制模板

Vue+Element后台管理系统

实现进程:

1. 组件实现FullPage效果

实现时间:2025/06/14

js 复制代码
import { View } from '@tarojs/components';
import { useRef, useEffect, useState } from 'react';
import style from './index.module.scss';

interface PropsType {
  className?: string;                // 外部传入的自定义 className,用于样式扩展
  children: React.ReactNode[];      // 子元素,每个视图为一个全屏页面
}

export default (props: PropsType) => {
  const { className, children } = props;

  const [pageIndex, setPageIndex] = useState(0);      // 当前页索引
  const wrapperRef = useRef<HTMLDivElement>(null);    // 滚动容器引用
  const isScrolling = useRef(false);                  // 滚动锁,用于节流处理防止频繁滚动

  /**
   * 根据索引滚动到对应页面
   * @param index 要滚动到的页面索引
   */
  const scrollToPage = (index: number) => {
    if (!wrapperRef.current) return;

    const offset = index * window.innerHeight;
    wrapperRef.current.style.transform = `translateY(-${offset}px)`;  // 通过 Y 轴平移实现翻页
  };

  /**
   * 鼠标滚轮事件处理函数(仅适用于 H5 端)
   */
  const handleWheel = (e: WheelEvent) => {
    if (isScrolling.current) return;

    // 启用节流,防止滚动过快
    isScrolling.current = true;
    setTimeout(() => {
      isScrolling.current = false;
    }, 800); // 与动画时长匹配

    // 根据滚轮方向切换页面
    if (e.deltaY > 0 && pageIndex < children.length - 1) {
      setPageIndex(prev => prev + 1); // 向下滚
    } else if (e.deltaY < 0 && pageIndex > 0) {
      setPageIndex(prev => prev - 1); // 向上滚
    }
  };

  /**
   * 页面索引更新时执行滚动
   */
  useEffect(() => {
    scrollToPage(pageIndex);
  }, [pageIndex]);

  /**
   * 组件挂载时绑定滚轮事件监听器
   * 卸载时移除监听器以避免内存泄漏
   */
  useEffect(() => {
    window.addEventListener('wheel', handleWheel, { passive: true });
    return () => window.removeEventListener('wheel', handleWheel);
  }, [pageIndex]);

  return (
    <View className={`${style['full-page-box']} ${className || ''}`}>
      <View className={style['full-page-wrapper']} ref={wrapperRef}>
        {children.map((child, idx) => (
          <View key={idx} className={style['full-page-item']}>
            {child}
          </View>
        ))}
      </View>
      {/* 最后一页不展示 */}
      {pageIndex < children.length - 1 && (
        <View className={style['top-arrow']}></View>
      )}
    </View>
  );
};
相关推荐
zzz_23683 分钟前
个人 AI 记忆如何跨工具复用:用 Markdown、索引和 Skill 搭一个可治理的记忆库
前端·人工智能·react.js·前端框架·agent·agent测评
剑之所向2 小时前
.NET 官方`System.Threading.Channels`
前端·javascript·数据库
计算机魔术师2 小时前
GPT-6 Astra幻觉砍到2%,却被一种老招数轻松绕过
前端
cjy0001113 小时前
2026AI 产品如何从一次性 Demo 变成可重复使用的业务工具?
前端·人工智能·fde
IT_陈寒3 小时前
React的状态更新坑得我差点加班到天亮
前端·人工智能·后端
风骏时光牛马3 小时前
深挖底层逻辑:XX源码深度拆解分析
前端
电商API_180079052473 小时前
电商商品价格监控工具淘宝京东商品价格抓取API项目实操分享
java·大数据·开发语言·前端·数据挖掘
sxmas3 小时前
用状态机与DAG建模四阶段业务流程:以MIND模型为例
前端
lee_curry4 小时前
AI Agent 工程师完整学习路线(面向生产级项目与面试)
人工智能·学习·ai·面试·agent
江湖十年4 小时前
在 Go 中使用 dyno 包处理动态对象
后端·面试·go