面试综合指南

中际旭创 · 制造业数据可视化工程师 — 从12篇教程到拿到Offer的最后一步。
涵盖岗位分析、技术全景、项目话术、高频考题、手写代码、薪资谈判和面试前检查清单。

01 · 岗位职责拆解

中际旭创是一家专注于光模块研发与制造的高科技企业(上市公司,代码 300308)。这个"制造业数据可视化工程师"岗位的核心是:用全栈技术搭建工厂的数据可视化平台

职责一:生产数据可视化大屏开发

基于 ECharts / Vue 开发车间大屏看板,实时展示产量、良率、设备状态等关键指标。

ECharts Vue 3 HTML/CSS/JS Vite WebSocket

对应教程

01-ECharts图表教程 · 02-Vue3核心教程 · 10-HTML-CSS-JS前端基础 · 11-Vite构建工具

职责二:后端数据服务开发

使用 Java / Spring Boot 开发 REST API,从 SQL Server 数据库查询数据,提供给前端展示。

Java Spring Boot RESTful API SQL Server

对应教程

03-Java后端开发 · 07-Java数据处理与报表 · 12-数据库设计与SQL优化

职责三:ETL数据处理与报表自动化

开发 ETL 流程,将 MES/ERP 等系统的数据抽取、清洗、转换后加载到数据仓库,生成自动化报表。

ETL Java SQL Redis

对应教程

09-ETL数据工程 · 07-Java数据处理与报表 · 12-数据库设计与SQL优化 · 06-Redis缓存数据库

职责四:系统部署与运维

使用 Docker 容器化部署前端/后端服务,配合 Git 进行版本管理,在 Linux 服务器上运行和维护。

Docker Git Linux Vite

对应教程

04-Docker容器化部署 · 05-Git版本控制 · 08-Linux基础命令 · 11-Vite构建工具

02 · 任职要求映射

编号 岗位要求 核心技能点 对应教程
R1 本科及以上学历,计算机/软件工程/信息管理相关专业 学历背景 — 非技术要求,但需准备自我介绍中的教育经历 -
R2 熟练掌握 Vue/React 等前端框架,有数据可视化开发经验 Vue 3 · ECharts · 组件化开发 · 响应式原理 · 大屏适配 02-Vue3 01-ECharts 10-HTML/CSS/JS
R3 熟悉 Node.js / Python 后端开发,能独立开发 RESTful API Express/Koa · FastAPI/Flask · RESTful 设计 · 中间件 · WebSocket 03-Node.js 07-Python
R4 熟悉 SQL Server / MySQL 等关系型数据库,了解 Redis SQL 查询优化 · 窗口函数 · 索引设计 · Redis 缓存策略 12-SQL 06-Redis
R5 了解 Docker / Linux / Git 等DevOps工具,有项目部署经验 Dockerfile · docker-compose · Linux常用命令 · Git工作流 04-Docker 05-Git 08-Linux
面试官重点关注的组合能力

这个岗位不是招"纯前端"或"纯后端",而是全栈 + 制造业领域知识。面试官最看重的是你能不能把前后端串起来,从数据库取数据 → 后端处理 → 前端展示,形成完整的数据流。

03 · 技能→教程对照表

以下是每个岗位要求所对应的具体技能点,以及你已经学完的教程编号。你已经完成了全部12篇教程,基础扎实!

岗位要求 具体技能 熟练度自评 教程来源
前端可视化
R2 前端框架Vue 3 组合式API、生命周期、组件通信
85%
02-Vue3
R2 数据可视化ECharts 柱/折/饼/仪表盘/地图配置
80%
01-ECharts
R2 页面布局Flexbox、Grid、响应式设计、CSS变量
75%
10-HTML/CSS/JS
R2 构建工具Vite配置、打包优化、代理配置
70%
11-Vite
后端服务
R3 Node.jsExpress路由、中间件、错误处理
75%
03-Node.js
R3 Python数据处理、Flask/FastAPI、pandas
70%
07-Python
数据库
R4 SQL窗口函数、索引优化、查询计划分析
72%
12-SQL
R4 Redis数据类型、缓存策略、过期机制
65%
06-Redis
DevOps
R5 DockerDockerfile、docker-compose、镜像管理
68%
04-Docker
R5 Git分支策略、冲突解决、rebase/merge
78%
05-Git
R5 Linux常用命令、日志排查、进程管理
66%
08-Linux
数据工程
R3 ETL数据抽取、清洗、转换、加载流程
70%
09-ETL

04 · 技术栈全景图

以下是你需要掌握的完整技术栈,以及它们之间的调用关系。面试时如果能画出这个图,面试官会认为你对全栈架构有清晰认知。

从数据源到用户屏幕的完整链路
📊
数据源
MES · ERP · SCADA
SQL Server · CSV · API
⚙️
ETL 层
Python 抽取/清洗/转换
定时任务 · 数据质量校验
🗄️
数据存储
SQL Server (主库)
Redis (缓存/实时)
🔧
后端服务
Node.js Express / Python FastAPI
RESTful API · WebSocket · 鉴权
🖥️
前端展示
Vue 3 + Vite
ECharts 大屏 · Element UI
🐳
DevOps
Docker 容器化
Git 版本管理 · Linux 部署
各层技术选型一览
Frontend
Vue 3
ECharts
Element UI
Vite
Flexbox
Backend
Node.js
Express
Python
FastAPI
Database
SQL Server
Redis
ETL
DevOps
Docker
Git
Linux

05 · 数据流架构(面试必背)

面试中极大概率会问:"请描述你设计的系统架构""数据从哪里来,怎么展示到屏幕上"。以下是标准答案模板:

数据流架构描述模板(口语化版本)
/* 面试回答模板 — 大约2分钟说完 */

"我们的系统分为四个层次:"

1. 数据源层
   "MES系统产生生产数据,存储在SQL Server数据库中。"
   "有些设备数据通过OPC UA协议实时采集。"

2. ETL/数据处理层
   "用Python编写ETL脚本,定时从MES库抽取数据,"
   "经过清洗、聚合后写入数据仓库。"
   "关键指标缓存到Redis,保证查询速度。"

3. 后端服务层
   "Node.js + Express提供RESTful API,前端调用获取图表数据。"
   "实时数据用WebSocket推送,确保大屏秒级刷新。"
   "复杂的数据计算逻辑放在Python微服务中处理。"

4. 前端展示层
   "Vue 3 + Vite构建SPA应用,ECharts渲染各类图表。"
   "组件化开发,一个图表一个组件,便于复用和维护。"
   "部署在Docker容器中,Nginx做反向代理。"
加分话术

提到以下关键词会让面试官眼前一亮:"数据血缘""增量同步""WebSocket推送""Redis缓存穿透防护""Docker Compose一键部署""Git Flow分支策略"

06 · STAR法则:如何描述项目经验

面试中描述项目时,永远使用 STAR 法则

S
Situation 情境
项目背景是什么?
业务需求是什么?
团队规模?
T
Task 任务
你的具体职责是?
要解决什么问题?
目标是什么?
A
Action 行动
你用了什么技术?
具体怎么实现的?
遇到什么困难?
R
Result 结果
量化成果(数据)
用户反馈?
性能提升?
常见错误

错误:"我用 Vue 做了一个看板系统。" — 太笼统,没有体现你的价值。

正确:"车间的生产数据之前靠人工每小时抄表,我开发了实时可视化看板,用 ECharts 展示 6 个核心 KPI,数据通过 WebSocket 秒级刷新,将异常响应时间从 30 分钟缩短到 2 分钟。"

07 · 项目范例一:生产可视化看板项目

📊
生产数据实时可视化看板
技术栈:Vue 3 + ECharts + Node.js + SQL Server + WebSocket + Docker
S 情境
某光模块制造车间有 12 条产线,之前靠人工每天填写 Excel 报表,数据滞后 24 小时,产线异常无法及时发现,管理层需要实时掌握生产状况。
T 任务
负责开发一套实时生产可视化看板系统,在车间大屏和办公电脑上展示 6 个核心 KPI:日产量、良率、设备稼动率、WIP 在制品、异常告警、OEE 综合效率。
A 行动
① 用 Vue 3 组合式 API 搭建前端,组件化设计:TopBar(总览)、LineChart(产量趋势)、GaugeChart(良率)、AlarmList(异常列表)
ECharts 配置仪表盘、折线图、柱状图,使用 dataZoom 实现时间范围筛选
Node.js + Express 开发后端 API,从 SQL Server 查询 MES 数据,WebSocket 实时推送异常告警
Redis 缓存最近 1 小时的聚合数据,API 响应时间从 800ms 降到 50ms
⑤ 使用 Docker + docker-compose 一键部署前后端 + Redis
R 结果
看板上线后,产线异常平均响应时间从 30 分钟缩短到 2 分钟,良率监控实现秒级刷新,月度生产会议不再需要提前 1 天准备数据,直接看大屏。系统稳定运行 6 个月零宕机

08 · 项目范例二:报表自动化项目

📋
制造报表自动化平台
技术栈:Python + SQL Server + ETL + Node.js + Vue 3
S 情境
工厂每天需要生成 15+ 张生产报表(日报、良率分析、设备利用率等),之前由 3 名文员每天花 3-4 小时 手动从各系统导出 Excel 再拼接,容易出错且无法追溯。
T 任务
开发一套报表自动化平台,实现数据自动抽取、计算、生成报表,并支持在线查看和导出。用户可以选择日期、产线、报表类型来生成自定义报表。
A 行动
① 用 Python 编写 ETL 脚本,每天凌晨 2 点定时从 MES 和 ERP 数据库抽取数据
② 数据经过清洗(去重、空值处理)→ 转换(聚合计算)→ 加载(写入数据仓库)
SQL 窗口函数实现同比环比计算、产线排名、累计产量等复杂统计
Node.js 提供 RESTful API,前端 Vue 3 + ECharts 实现在线预览和交互式筛选
⑤ 使用 Redis 缓存报表数据,避免重复查询数据库
R 结果
报表生成时间从 3-4 小时缩短到 5 分钟(全自动),数据准确率从 92% 提升到 99.8%,释放 3 名文员去做更有价值的工作。系统累计生成报表 2000+ 张

09 · 项目范例三:ETL数据平台项目

🔄
ETL 数据集成与治理平台
技术栈:Python + SQL Server + Redis + Docker + Linux
S 情境
公司有 MES、ERP、WMS 三个核心系统,数据分散在不同数据库中,格式不统一。数据分析师需要跨系统数据时,需要人工导出再合并,耗时且易错。数据质量无法保证。
T 任务
构建统一的 ETL 数据平台,将三个系统的数据抽取、清洗、标准化后加载到数据仓库,提供统一的数据查询接口,并实现数据质量监控。
A 行动
① 设计 ETL 管道架构:抽取层(支持全量/增量)→ 清洗层(规则引擎)→ 加载层(写入数据仓库)
Python 实现核心 ETL 逻辑,使用 SQL Server 作为数据仓库,Redis 记录增量同步位点
③ 开发数据质量监控模块:空值率、重复率、异常值检测,问题数据写入告警表
Docker 容器化部署 ETL 服务,Linux crontab 管理定时调度
Git 管理代码版本,使用 feature 分支开发、PR review 合并
R 结果
数据从 3 个系统统一到 1 个数据仓库,数据查询效率提升 10 倍(统一接口 vs 之前跨库联查),数据质量评分从 78 分提升到 95 分,增量同步将每日 ETL 时间控制在 30 分钟以内

10 · 高频面试题 — 前端 (10题)

Q1中等
请描述 ECharts 的基本配置结构,如何配置一个仪表盘(Gauge)图表?
核心:init → setOption → series.type:'gauge'。提到 detail 属性显示数值、axisLine 配置颜色区间、data 数组传入值。可以顺带提到 resize 监听窗口变化。
ECharts 手写代码
Q2中等
Vue 3 的生命周期钩子有哪些?在组合式 API 中怎么使用?
setup() → onMounted → onUpdated → onUnmounted。重点说 onMounted 里发起 API 请求和初始化 ECharts,onUnmounted 里销毁 ECharts 实例和清理定时器防止内存泄漏。
Vue 3
Q3困难
Vue 3 的响应式原理是什么?ref 和 reactive 有什么区别?
Vue 3 使用 Proxy 实现响应式(vs Vue 2 的 Object.defineProperty)。ref 适合基本类型,通过 .value 访问;reactive 适合对象/数组。shallowRef / shallowReactive 用于性能优化。
Vue 3 原理
Q4中等
Vue 组件之间怎么通信?列举至少 4 种方式。
① props / emit(父子)② provide / inject(跨层级)③ Pinia/Vuex(全局状态)④ ref + expose(父调子方法)⑤ EventBus/mitt(兄弟组件)⑥ URL 参数。重点讲 props/emit,因为这个最常用。
Vue 3
Q5基础
Flexbox 常用属性有哪些?如何实现一个左右固定、中间自适应的三栏布局?
display:flex; 左右设置固定 width/flex-shrink:0,中间设置 flex:1。常用属性:justify-content、align-items、flex-direction、flex-wrap、gap。
CSS
Q6中等
如何实现大屏自适应?屏幕尺寸差异很大时,ECharts 图表怎么保持正确比例?
① 方案一:vw/vh + rem 方案,根据设计稿比例换算。② 方案二:scale 整体缩放(最常用),用 transform: scale() 配合 windowResize 监听。③ ECharts 的 chart.resize() 方法。④ 使用 AutoResize 组件。
ECharts CSS 大屏
Q7中等
Vue 3 中 watch 和 computed 有什么区别?分别在什么场景用?
computed:依赖其他响应式数据计算派生值,有缓存,适合"根据条件过滤列表"等场景。watch:监听数据变化执行副作用(API 请求、DOM 操作),适合"数据变化后重新渲染 ECharts"等场景。
Vue 3
Q8基础
什么是虚拟DOM?Vue为什么使用虚拟DOM?
虚拟 DOM 是 JS 对象表示的 DOM 树结构。好处:① 跨平台(SSR/Canvas/Native)② diff 算法批量更新减少 DOM 操作 ③ 方便做组件级更新。但注意:虚拟 DOM 不一定比直接操作 DOM 快,它的优势在于"可预测的性能"。
Vue 3 原理
Q9中等
ECharts 如何实现实时数据更新?
核心方案:setInterval + setOption({series:[{data: newData}]}),ECharts 会自动做数据过渡动画。进阶:WebSocket 接收后端推送数据 → 更新 ECharts。注意销毁时 clearInterval 和 dispose() 防止内存泄漏。配合 notMerge 或 replaceMerge 控制合并策略。
ECharts 实时
Q10基础
Vite 相比 Webpack 有什么优势?为什么选 Vite?
① 开发时基于原生 ESM,不需要打包,启动快(毫秒级 vs 分钟级)。② HMR 热更新速度与项目规模无关。③ 生产环境使用 Rollup 打包。④ 配置简单,开箱即用。⑤ 对 Vue/React 有一等公民支持。
Vite 构建工具

11 · 高频面试题 — 后端 (8题)

Q11中等
如何设计一个 RESTful API?举例说明。
核心原则:URL 表示资源,HTTP 方法表示操作。GET /api/production-lines(列表)、GET /api/production-lines/:id(详情)、POST(创建)、PUT(更新)、DELETE(删除)。返回统一格式 {code, data, message}。状态码正确使用 200/201/400/404/500。
Node.js RESTful
Q12中等
Express 中间件的执行机制是什么?如何写一个日志中间件?
中间件按注册顺序执行,每个接收 (req, res, next) 参数,调用 next() 传递给下一个。洋葱模型。日志中间件:记录请求方法、URL、时间戳、响应状态码、耗时。用 app.use() 全局注册或挂载到特定路由。
Node.js
Q13困难
Node.js 的事件循环(Event Loop)是什么?为什么 Node.js 适合处理高并发?
Node.js 是单线程的,通过事件循环实现异步非阻塞 I/O。六个阶段:timers → pending → idle → poll → check → close。单线程不等于不能并发——I/O 操作交给 libuv 线程池处理。适合 I/O 密集型(数据库查询、文件读写、网络请求),不适合 CPU 密集型(大量计算)。
Node.js 原理
Q14中等
WebSocket 和 HTTP 有什么区别?在什么场景用 WebSocket?
HTTP 是请求-响应模式,单向的。WebSocket 是全双工长连接,服务端可主动推送。适用场景:实时看板数据推送、设备告警通知、在线协同。在制造业可视化中,WebSocket 用于实时推送设备状态、产量更新到前端大屏。
Node.js 实时
Q15基础
Python 和 Node.js 在后端开发中各有什么优劣势?你怎么选择?
Python 优势:数据处理/科学计算生态强大(pandas/numpy),ETL 脚本首选,AI/ML 集成方便。Node.js 优势:前端工程师上手快,异步 I/O 高性能,WebSocket/实时通信方便。实际项目中:API 服务用 Node.js(和前端统一技术栈),数据处理/ETL 用 Python。
Node.js Python
Q16中等
如何处理后端 API 的错误和异常?
Express 全局错误中间件 app.use((err, req, res, next) => {}) 捕获同步和异步错误。async/await 场景用 try-catch 包装或 express-async-errors 库。统一错误格式 {code, message, detail}。日志记录用 winston 或 morgan。注意不要把内部错误信息暴露给前端。
Node.js
Q17困难
Node.js 如何连接 SQL Server 数据库?如何防止 SQL 注入?
使用 mssql 包(或 tedious 底层驱动)。连接方式:通过配置对象(server, database, user, password)创建连接池。防 SQL 注入:永远使用参数化查询 request.input('param', type, value),不拼接 SQL 字符串。连接池管理:设置 max/min pool size、idle timeout。
Node.js SQL Server
Q18中等
什么是跨域问题?怎么解决?
浏览器同源策略限制:协议+域名+端口必须一致。解决方案:① CORS(后端设置 Access-Control-Allow-Origin 响应头)② Vite 开发代理(server.proxy)③ Nginx 反向代理。生产环境用 Nginx 代理最常见。
前端 Node.js

12 · 高频面试题 — 数据库 (8题)

Q19中等
什么是窗口函数?请举例说明在报表场景中的应用。
窗口函数对一组相关行进行计算而不合并行。语法:FUNC() OVER (PARTITION BY ... ORDER BY ...)。应用:ROW_NUMBER() 产线排名、RANK() 良率排名、LAG/LEAD 同比环比计算、SUM() OVER 累计产量。这是面试高频手写题。
SQL 手写代码
Q20困难
如何优化慢查询?你的优化思路是什么?
① 先用 EXPLAIN / 执行计划分析瓶颈(全表扫描?缺少索引?)② 确认 WHERE/JOIN/ORDER BY 字段有索引 ③ 避免 SELECT *,只查需要的列 ④ 分页查询用 OFFSET FETCH 或游标 ⑤ 大表考虑分区 ⑥ 查询结果缓存到 Redis ⑦ 定期更新统计信息。
SQL 性能
Q21中等
SQL Server 和 MySQL 有什么区别?这个岗位为什么用 SQL Server?
区别:SQL Server 是微软商业数据库(.NET 生态),MySQL 是开源的。SQL Server 在 Windows 环境集成好、SSIS/SSRS 报表工具强、企业级安全特性完善。制造业用 SQL Server 是因为 MES/ERP 系统(如 SAP)后端通常是 SQL Server,数据直接对接最方便。
SQL Server
Q22中等
Redis 常用的数据类型有哪些?在制造业场景中怎么用?
五种基本类型:String(缓存查询结果)、Hash(存储设备状态对象)、List(最新告警队列)、Set(去重)、ZSet(排行榜-产线产量排名)。制造业场景:缓存聚合数据(String)、实时设备状态(Hash)、告警消息队列(List)。
Redis
Q23基础
什么是索引?什么时候该建索引?什么时候不该建?
索引类似书的目录,加速查询但拖慢写入。该建:WHERE 条件列、JOIN 关联列、ORDER BY 排序列、高频查询字段。不该建:数据量小的表、频繁更新的列、区分度低的列(如性别)。复合索引注意最左前缀匹配原则。
SQL
Q24困难
如何设计数据库表结构?范式和反范式怎么取舍?
三范式核心:1NF 原子性、2NF 完全依赖主键、3NF 消除传递依赖。OLTP 系统遵循范式减少冗余。OLAP/报表系统(制造业看板场景)可适当反范式——用冗余字段避免 JOIN,提升查询速度。例:订单表冗余"产线名称"字段,避免每次 JOIN 产线表。
SQL 设计
Q25中等
Redis 缓存穿透、缓存击穿、缓存雪崩分别是什么?怎么解决?
穿透(查不存在的数据)→ 布隆过滤器/缓存空值。击穿(热点 key 过期瞬间大量请求打向数据库)→ 互斥锁/永不过期。雪崩(大量 key 同时过期)→ 过期时间加随机值。这是 Redis 面试经典三连问。
Redis 高频
Q26中等
ETL 的全量同步和增量同步有什么区别?分别适用什么场景?
全量:每次把源表所有数据重新抽取一遍,简单但慢,适合数据量小或初始化。增量:只同步上次以来的变化数据(通过时间戳/自增ID/变更日志),高效但逻辑复杂。制造业场景:历史数据用全量初始化,日常用增量同步(每5分钟/每小时)。Redis 记录上次同步位点。
ETL Redis

13 · 高频面试题 — DevOps (6题)

Q27中等
Docker 的核心概念是什么?容器和虚拟机有什么区别?
核心概念:镜像(Image,只读模板)、容器(Container,运行实例)、Dockerfile(构建脚本)、Registry(镜像仓库)。容器 vs 虚拟机:容器共享宿主内核,启动秒级,MB 级;虚拟机有独立内核,启动分钟级,GB 级。容器更轻量适合微服务部署。
Docker
Q28中等
如何写一个 Dockerfile 来部署 Vue 前端应用?
两阶段构建:① node:18-alpine 镜像中 npm install + npm run build ② nginx:alpine 镜像中复制 dist 到 /usr/share/nginx/html。好处:最终镜像很小(~20MB vs 1GB+)。这是手写代码高频题。
Docker Vue 手写代码
Q29中等
Git 的 merge 和 rebase 有什么区别?什么时候用哪个?
merge:保留完整历史,创建合并提交,多人协作安全。rebase:线性历史更干净,但改写历史,不要在公共分支上用。建议:feature 分支 rebase main 保持更新,合并到 main 时用 merge。冲突解决:先 fetch → rebase/merge → 手动解决冲突 → git add → continue。
Git
Q30基础
常用的 Linux 命令有哪些?线上服务挂了怎么排查?
排查流程:① top/htop 看CPU/内存 ② df -h 看磁盘空间 ③ free -m 看内存 ④ tail -f / journalctl 看日志 ⑤ netstat/ss 看端口占用 ⑥ ps aux | grep 找进程 ⑦ docker logs 看容器日志。重在"排查思路"而不只是背命令。
Linux
Q31中等
docker-compose 是什么?怎么编排多个服务?
定义和运行多个容器的工具。一个 docker-compose.yml 管理前端(Nginx)、后端(Node.js)、数据库(SQL Server)、缓存(Redis) 四个服务。关键配置:depends_on 控制启动顺序、volumes 数据持久化、ports 端口映射、environment 环境变量。一键启动:docker-compose up -d。
Docker
Q32基础
你们团队的 Git 工作流是怎样的?
推荐回答 Git Flow:main(生产)← develop(开发)← feature/*(功能分支)。开发流程:从 develop 切 feature 分支 → 开发完成提 PR → Code Review → 合并到 develop → 测试通过后合并到 main → 打 tag 发布。hotfix 直接从 main 切。
Git

14 · 高频面试题 — 项目/场景 (6题)

Q33困难
请描述一下开发一个大屏看板的完整流程,从需求到上线。
① 需求分析:和车间主管确认 KPI 指标、数据来源、更新频率 ② UI 设计:确认大屏分辨率(1920×1080),设计布局草图 ③ 数据层:确认数据在哪个库、写 SQL 查询/ETL ④ 后端:开发 API 接口,缓存策略 ⑤ 前端:Vue 组件开发,ECharts 图表配置,大屏适配 ⑥ 联调:前后端对接,WebSocket 实时推送 ⑦ 部署:Docker 打包,Nginx 反向代理,大屏测试 ⑧ 验收:和业务方确认数据准确性。
场景 必考
Q34困难
如果要实现一个实时数据展示方案,数据每 5 秒更新一次,你会怎么设计?
方案一(轻量):前端 setInterval 每 5 秒调 API 轮询,后端查 Redis 缓存。适合并发量不大的内部系统。方案二(推荐):WebSocket 长连接,后端定时查数据库/接收设备推送,主动推送给前端。方案三(大型):消息队列(RabbitMQ/Kafka)+ WebSocket,支持多客户端。选方案时要考虑:并发量、实时性要求、基础设施成本。
场景 架构
Q35中等
如何设计一个 ETL 流程,把 MES 数据同步到数据仓库?
① 确认源表结构和目标表结构 ② 选择同步策略:全量(初始化)+ 增量(日常,通过 UpdateTime 字段)③ 清洗规则:空值处理、数据类型转换、去重 ④ 加载策略:TRUNCATE + INSERT(全量)或 MERGE(增量 upsert)⑤ 调度:Linux crontab 或 Node.js node-cron ⑥ 监控:记录同步行数、耗时、错误日志 ⑦ 容错:失败重试 + 告警通知。
ETL 设计
Q36中等
你做过最有挑战的项目是什么?遇到了什么困难?怎么解决的?
用 STAR 法则回答。推荐用"生产看板"或"ETL平台"项目。困难可以是:① 数据量太大查询慢 → 加索引+Redis缓存 ② 大屏分辨率适配 → scale方案 ③ WebSocket 断线重连 → 心跳检测+指数退避 ④ ETL 增量同步数据不一致 → 引入校验机制。关键:展示解决问题的过程。
场景 必考
Q37中等
前后端联调时遇到过什么问题?怎么解决的?
常见问题:① 接口字段对不上 → 前后端先定义 Swagger/接口文档 ② 跨域 → Vite proxy 开发 / Nginx 生产 ③ 数据格式不一致(时间戳 vs 字符串)→ 统一约定 ④ 接口报错看不出来 → 加统一的错误拦截和日志。经验:先联调一个完整链路,再并行开发。
场景
Q38困难
如果让你从零搭建一个制造业数据可视化平台,你会怎么做?
按优先级:① 先搭数据层 — 确认数据源,建数据仓库,写 ETL ② 再搭后端 — Node.js + Express API,连接数据库 ③ 然后搭前端 — Vue 3 + ECharts 看板 ④ 最后部署 — Docker 容器化 + Linux + Nginx。关键:先跑通一个最小闭环(1个图表的数据流),再逐步扩展。技术选型理由:Vue(上手快)+ Node.js(前后端统一语言)+ SQL Server(和MES对接方便)+ Docker(部署简单)。
场景 架构 必考

15 · 手写代码 — ECharts 仪表盘配置

EXERCISE 01
ECharts Gauge 仪表盘 — 从零配置
高频手写题

题目:请在 HTML 页面中实现一个"良率仪表盘",范围 0-100%,分为三个颜色区间(红 0-60、黄 60-85、绿 85-100),当前值 92.5%。

HTML + JavaScript — ECharts 仪表盘完整配置
<div id="gauge" style="width:400px;height:400px"></div>

<script>
  var chart = echarts.init(document.getElementById('gauge'));

  chart.setOption({
    series: [{
      type: 'gauge',
      min: 0,
      max: 100,
      splitNumber: 10,
      axisLine: {
        lineStyle: {
          width: 20,
          color: [
            [0.6, '#ff6b6b'],   // 0-60 红色
            [0.85, '#ffd93d'],  // 60-85 黄色
            [1, '#6bcb77']      // 85-100 绿色
          ]
        }
      },
      pointer: { width: 5 },
      axisTick: { distance: -20, length: 6 },
      splitLine: { distance: -20, length: 14 },
      axisLabel: { distance: -25, fontSize: 11 },
      detail: {
        valueAnimation: true,
        formatter: '{value}%',
        fontSize: 24,
        offsetCenter: [0, '70%']
      },
      title: {
        offsetCenter: [0, '90%'],
        fontSize: 14
      },
      data: [{ value: 92.5, name: '良率' }]
    }]
  });

  // 窗口自适应
  window.addEventListener('resize', () => chart.resize());
</script>
面试加分点

① 提到 window.addEventListener('resize', chart.resize()) 做响应式 ② 提到 chart.dispose() 在组件销毁时清理 ③ 提到 setOption 的 notMerge 参数控制是否合并配置 ④ 提到可以用 setInterval 定时更新 data 实现实时刷新。

16 · 手写代码 — Vue 3 组件

EXERCISE 02
Vue 3 组合式 API — Props + Emit 组件
高频手写题

题目:写一个 YieldGauge.vue 组件,接收 lineName 和 yieldValue 两个 props,点击按钮时 emit 一个 refresh 事件。

Vue 3 — YieldGauge.vue(组合式 API + <script setup>)
<template>
  <div class="gauge-card">
    <h3>{{ lineName }} 产线良率</h3>
    <div ref="chartRef" style="width:100%;height:300px"></div>
    <button @click="handleRefresh">刷新数据</button>
  </div>
</template>

<script setup>
import { ref, onMounted, onUnmounted, watch } from 'vue'
import * as echarts from 'echarts'

// Props 定义
const props = defineProps({
  lineName: { type: String, required: true },
  yieldValue: { type: Number, required: true }
})

// Emit 定义
const emit = defineEmits(['refresh'])

const chartRef = ref(null)
let chartInstance = null

function renderChart() {
  if (!chartInstance) return
  chartInstance.setOption({
    series: [{
      type: 'gauge',
      detail: { formatter: '{value}%' },
      data: [{ value: props.yieldValue }]
    }]
  })
}

function handleRefresh() {
  emit('refresh', props.lineName)
}

onMounted(() => {
  chartInstance = echarts.init(chartRef.value)
  renderChart()
})

watch(() => props.yieldValue, () => renderChart())

onUnmounted(() => {
  chartInstance?.dispose()
})
</script>

17 · 手写代码 — Express API 端点

EXERCISE 03
Node.js Express — RESTful API 端点
高频手写题

题目:用 Express 写一个 API 端点,查询指定产线的生产数据,支持日期范围筛选,返回 JSON 格式。

Node.js — Express API 端点
const express = require('express')
const sql = require('mssql')
const app = express()

// 数据库配置
const dbConfig = {
  server: '192.168.1.100',
  database: 'MES_DB',
  user: 'sa',
  password: '******',
  options: { encrypt: false }
}

// GET /api/production/:lineId — 查询产线生产数据
app.get('/api/production/:lineId', async (req, res) => {
  try {
    const { lineId } = req.params
    const { startDate, endDate } = req.query

    // 参数校验
    if (!startDate || !endDate) {
      return res.status(400).json({
        code: 400,
        message: '缺少 startDate 或 endDate 参数'
      })
    }

    // 连接数据库(参数化查询防 SQL 注入)
    const pool = await sql.connect(dbConfig)
    const result = await pool.request()
      .input('lineId', sql.Int, parseInt(lineId))
      .input('start', sql.DateTime, new Date(startDate))
      .input('end', sql.DateTime, new Date(endDate))
      .query(`
        SELECT ProductionDate, Output, Yield, DefectCount
        FROM ProductionRecords
        WHERE LineId = @lineId
          AND ProductionDate BETWEEN @start AND @end
        ORDER BY ProductionDate
      `)

    res.json({
      code: 200,
      data: result.recordset,
      message: 'ok'
    })
  } catch (err) {
    console.error('查询失败:', err)
    res.status(500).json({
      code: 500,
      message: '服务器内部错误'
    })
  }
})

app.listen(3000, () => console.log('Server running on :3000'))

18 · 手写代码 — SQL 窗口函数

EXERCISE 04
SQL — 窗口函数 + 环比计算
高频手写题

题目:查询各产线每月的产量,并计算环比增长率(与上月对比),按产线分组,按月份排序。

SQL Server — 窗口函数实战查询
-- 产线月度产量 + 环比增长率
WITH MonthlyOutput AS (
  SELECT
    LineName,
    FORMAT(ProductionDate, 'yyyy-MM') AS Month,
    SUM(Output) AS TotalOutput,
    AVG(Yield) AS AvgYield
  FROM ProductionRecords
  WHERE ProductionDate >= '2025-01-01'
  GROUP BY LineName, FORMAT(ProductionDate, 'yyyy-MM')
)
SELECT
  LineName,
  Month,
  TotalOutput,
  AvgYield,
  -- 上月产量(LAG 向下偏移一行)
  LAG(TotalOutput, 1) OVER (
    PARTITION BY LineName ORDER BY Month
  ) AS PrevOutput,
  -- 环比增长率
  CAST(
    (CAST(TotalOutput AS FLOAT) -
     LAG(TotalOutput, 1) OVER (PARTITION BY LineName ORDER BY Month))
    / NULLIF(LAG(TotalOutput, 1) OVER (PARTITION BY LineName ORDER BY Month), 0)
    * 100 AS DECIMAL(5,2)
  ) AS GrowthRate,
  -- 产线内排名
  RANK() OVER (PARTITION BY Month ORDER BY TotalOutput DESC) AS RankInMonth
FROM MonthlyOutput
ORDER BY LineName, Month;
窗口函数核心知识点

LAG(col, n):获取当前行前 n 行的值 → 算环比。 LEAD(col, n):获取后 n 行 → 算同比。 ROW_NUMBER():连续编号。 RANK():并列跳号。 SUM(col) OVER():累计求和。关键语法:FUNCTION() OVER (PARTITION BY ... ORDER BY ...)

19 · 手写代码 — Dockerfile

EXERCISE 05
Dockerfile — Vue 应用容器化部署
高频手写题

题目:为 Vue 3 前端应用编写 Dockerfile,使用多阶段构建,最终用 Nginx 提供静态文件服务。

Dockerfile — 多阶段构建
# ===== 阶段1:构建 =====
FROM node:18-alpine AS builder

WORKDIR /app

# 先复制依赖文件(利用 Docker 缓存层)
COPY package.json package-lock.json ./
RUN npm ci

# 复制源代码并构建
COPY . .
RUN npm run build

# ===== 阶段2:运行 =====
FROM nginx:alpine

# 复制构建产物到 Nginx 目录
COPY --from=builder /app/dist /usr/share/nginx/html

# 复制 Nginx 配置(支持 Vue Router history 模式)
COPY nginx.conf /etc/nginx/conf.d/default.conf

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]
nginx.conf — Vue Router History 模式支持
server {
    listen 80;
    server_name localhost;

    location / {
        root /usr/share/nginx/html;
        index index.html;
        try_files $uri $uri/ /index.html;  # Vue Router history 模式
    }

    # API 反向代理到后端服务
    location /api/ {
        proxy_pass http://backend:3000/;
    }
}
面试加分点

① 提到多阶段构建的好处:最终镜像只有 Nginx + 静态文件(~20MB),不含 Node.js 和源码 ② .dockerignore 排除 node_modules、.git 等 ③ 提到 docker-compose 配合后端 + 数据库一起启动 ④ EXPOSE 只是声明,实际映射靠 -p 参数。

20 · 薪资谈判指南

市场参考数据(2025-2026年)
城市/级别 应届/0-1年 1-3年 3-5年 5年+
烟台(中际旭创总部) 6K-9K 8K-14K 13K-20K 18K-28K
一线城市(北上广深)同岗 8K-13K 12K-20K 18K-30K 25K-40K
制造业 IT 岗位(全国均) 5K-8K 7K-12K 10K-18K 15K-25K

注:以上为参考范围,具体受学历、项目经验、面试表现、公司当期预算等因素影响。中际旭创作为上市公司,薪资通常高于同地区制造业平均水平。

谈判策略

第一步:确定你的底线和目标

面试前确定三个数:最低可接受薪资(底线)、合理期望薪资(目标)、理想薪资(争取值)。目标值 = 底线 + 20%~30%。

第二步:薪资讨论时的回答技巧
话术模板
/* 当 HR 问"你的期望薪资是多少?" */

"根据我对这个岗位的了解,结合我的全栈技术能力
(Vue + ECharts + Node.js + SQL Server + Docker),
以及制造业数据可视化的项目经验,
我的期望薪资范围是 [目标值] 左右。
但我更看重这个岗位的学习成长空间和团队氛围,
薪资方面是可以在合理范围内商量的。"

/* 关键点:
   ① 给范围,不给死数
   ② 强调你的技术栈匹配度
   ③ 表达灵活性,不显得死板
*/
第三步:综合评估 Offer
评估维度关注点权重
基本薪资税前月薪、绩效比例
年终奖几个月?是否有保底?
五险一金缴纳基数和比例(按全额还是最低?)
加班情况是否 996?加班费?调休?
技术成长团队规模、技术氛围、学习机会
通勤距离单程时间、是否有班车
福利补贴餐补、交通补、年度体检、股票期权
注意事项

① 不要先报数字,让对方先给范围 ② 不要拿别的 Offer 压价(除非你真的不想要这个)③ 年终奖问清楚是"保底几个月"还是"视绩效" ④ 试用期薪资一般是转正的 80%,确认清楚 ⑤ 确认五险一金的缴纳基数——差很多。

21 · 面试前检查清单

面试前一天晚上,按照以下清单逐项检查。每完成一项,在前面打个勾。

  • 技术复习
  • ECharts 核心配置 — 回顾 series / xAxis / yAxis / tooltip 的配置写法,能默写 gauge 和 bar
  • Vue 3 生命周期 — onMounted 里做什么(API请求、ECharts初始化)、onUnmounted 里做什么(dispose、clearInterval)
  • SQL 窗口函数 — 能手写 LAG/LEAD/RANK/ROW_NUMBER 的语法,理解 PARTITION BY
  • Redis 三连问 — 缓存穿透/击穿/雪崩的解决方案倒背如流
  • Docker 常用命令 — docker build / run / ps / logs / exec / docker-compose up
  • Git 冲突解决 — fetch → merge/rebase → 解决冲突 → add → commit/push 流程
  • 项目话术准备
  • 准备 2-3 个项目故事 — 用 STAR 法则写好"生产看板"、"报表自动化"或"ETL平台"的讲述稿
  • 量化数据准备好 — "响应时间从X降到Y"、"处理了Z条数据"、"服务N个月稳定运行"
  • 技术难点准备 — 每个项目准备 1 个"遇到的问题 + 解决方案"的故事
  • 自我介绍
  • 1 分钟自我介绍 — 姓名 + 学历 + 技术栈 + 核心项目经验 + 为什么适合这个岗位
  • 3 分钟版本 — 展开讲 1-2 个项目的具体技术实现和成果
  • 了解公司
  • 了解中际旭创 — 光模块行业龙头、上市公司(300308)、产品是光通信模块、客户包括 Google/Amazon 等数据中心
  • 了解制造业 IT 痛点 — 数据孤岛、实时性差、报表依赖人工、系统间不互通
  • 准备反问问题
  • 技术问题:团队目前用什么技术栈?数据可视化平台发展到什么阶段了?
  • 团队问题:IT 团队有多少人?前后端分工是怎样的?
  • 成长问题:入职后前三个月主要做什么?有哪些学习成长的机会?
  • 物质准备
  • 着装 — 商务休闲(衬衫 + 休闲裤即可),制造业企业不需要正装但不要太随意
  • 纸质简历 — 打印 2-3 份,以防面试官没带
  • 笔和笔记本 — 面试中可能需要画架构图或写代码
  • 提前确认路线 — 面试地点、交通方式、预计用时,提前 10-15 分钟到
面试当天心态提醒

不会的就说不会,但要说出你的思考方向 — 面试官更看重解决问题的思路 ② 用制造业的例子回答,而不是泛泛而谈 — 比如说"车间的良率看板"而不是"一个图表" ③ 放慢语速,想清楚再回答 — 不急 ④ 表达热情 — "我对制造业数字化转型很感兴趣"比"我需要一份工作"强 100 倍。

祝面试顺利!

你已经完成了12篇教程的系统学习,技术基础扎实。
现在只需要把知识点串起来,自信地展示你的全栈能力。

全栈技术 + 制造业领域理解 = 你的核心竞争力