主要内容: - 包含12个产业的完整教务系统前端代码 - 智能启动脚本 (start-industry.sh) - 可视化产业导航页面 (index.html) - 项目文档 (README.md) 优化内容: - 删除所有node_modules和.yoyo文件夹,从7.5GB减少到2.7GB - 添加.gitignore文件避免上传不必要的文件 - 自动依赖管理和智能启动系统 产业列表: 1. 文旅产业 (5150) 2. 智能制造 (5151) 3. 智能开发 (5152) 4. 财经商贸 (5153) 5. 视觉设计 (5154) 6. 交通物流 (5155) 7. 大健康 (5156) 8. 土木水利 (5157) 9. 食品产业 (5158) 10. 化工产业 (5159) 11. 能源产业 (5160) 12. 环保产业 (5161) 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
210 lines
12 KiB
Python
210 lines
12 KiB
Python
#!/usr/bin/env python3
|
||
import json
|
||
import os
|
||
from datetime import datetime
|
||
|
||
# 读取影视摄像的原始数据
|
||
with open('网页未导入数据/视觉设计产业/视觉设计岗位简历.json', 'r', encoding='utf-8') as f:
|
||
positions_data = json.load(f)
|
||
|
||
# 找到影视摄像的数据
|
||
photography_data = None
|
||
for position in positions_data:
|
||
if position.get("岗位名称") == "影视摄像":
|
||
photography_data = position
|
||
break
|
||
|
||
if not photography_data:
|
||
print("未找到影视摄像数据")
|
||
exit(1)
|
||
|
||
# 手动解析面试题内容
|
||
interview_content = photography_data.get("面试题内容", "")
|
||
|
||
# 构建问题和答案 - 从场景模拟问答题中提取
|
||
questions = [
|
||
{
|
||
"question": "你接到一个客户 brief,要拍摄一支 60 秒的品牌短片,主题为『年轻人的环保生活方式』。预算 5 万元人民币,时长 1 天。请你从前期策划、拍摄脚本、场地选择、主辅镜头规划、灯光/音频配置、后期处理要点逐项现场口述方案。",
|
||
"answer": "前期策划:调研目标群体,制定叙事框架(人物线与环保行动线交错),制作分镜图与拍摄脚本。场景安排:选择环保主题场地(如自行车租赁点、社区垃圾分类区、咖啡店用循环保温杯);白天时间控制拍摄时段避免逆光。主辅镜头设计:主体拍摄采用固定轨道镜头+手持跟拍,辅镜头取动作特写、环境细节、背景干扰控制。灯光音频配置:利用自然光为主+补光板增强主体亮度,麦克全指向人物演讲处,无线领夹麦克确保语音清晰。后期核心:剪辑节奏符合情感变化,主调色整体清新绿意调,搭配环保类背景音乐+字幕简明说明。预算与时间顾虑:提前踩点节省现场沟通时间;合理调配租赁道具/演员费用。"
|
||
},
|
||
{
|
||
"question": "请举例说明你的一次灯光布置或器材配置过程,以及你为什么这么做?",
|
||
"answer": "去年拍摄一组校园宣传片时为了突出人物面部表情,我在顶棚布置了一只柔光箱做主光,同时用两只直射光源作为逆光勾勒轮廓。相机设定:光圈f/2.8,快门速度1/60,ISO 400。使用测光表确保脸部不过曝、背景不过暗。三点布光控制了阴影范围并提升立体感,同时玻璃反光板用于补充侧面柔光,确保服饰和背景不过分曝光,还加了一层黄色色温卡制造温暖情绪。过程遵循'硬光控制轮廓、软光强化主体'的组织框架。"
|
||
},
|
||
{
|
||
"question": "你最常使用的后期处理软件是什么?请说明你一个常用的剪辑或调色技巧。",
|
||
"answer": "对静态摄影,我常用Adobe Lightroom和Photoshop调色修饰人像或人文场景,偏好使用分离补光笔刷控制肤色区域与环境的色温分层;对动态摄像,我使用DaVinci Resolve,通过Clarity工具在不同调色层(曲线+LOG输出)中加入VSCO Pro经典场景调LUT,营造背光轮廓清晰但背景柔化、色调温暖的效果。若有时间我会阅读Color Grading社区中技术文章,自学掌握3D LUT与HDR调色流程。"
|
||
},
|
||
{
|
||
"question": "拍摄过程中遇到客户临时提出新要求,例如要求改变调性或者再补几组街拍,你通常如何应对?",
|
||
"answer": "我会保持冷静、先确认修改或补拍具体内容,再迅速调整日程优先级。例如在一次企业活动拍摄中,客户临时要求增加一组员工街拍和活动氛围镜头,我先按时间表重新安排拍摄顺序(先拍常规题材、再拍新增内容),最后通过压缩后期调色时间、加班处理素材,最终在不影响质量前提下按时交稿。拍摄结束后,我向客户说明流程调整之处,取得理解与好评。"
|
||
},
|
||
{
|
||
"question": "如果客户坚持喜欢画面高饱和、HDR式浓烈风格,但你认为画面应保持'高级、不过度渲染'的视觉,你应如何回应最合理?",
|
||
"answer": "提出两三种不同调色样片(HDR、自然、柔光风),让客户做选择。这样既尊重客户的偏好,也展示了专业建议,让客户看到不同风格的实际效果后做出更明智的决定。"
|
||
},
|
||
{
|
||
"question": "拍摄一个人物向右行走的场景,为了构图留白与视觉缓冲,下列哪种做法最合理?",
|
||
"answer": "人物放在左侧三分之一处(留前方空间给右边方向)。这样的构图符合视觉动势原理,给运动方向留出空间,让画面更具动感和平衡感。"
|
||
},
|
||
{
|
||
"question": "摄影中的'三分法则'是什么?如何运用在实际拍摄中?",
|
||
"answer": "三分法则是将画面横竖各分成三等分,重要元素放置在线条交叉点或沿线条分布。实际运用中,人物眼睛通常放在上三分之一线,地平线放在下三分之一或上三分之一线,避免居中分割画面。这样能创造更有动感和平衡的构图。"
|
||
},
|
||
{
|
||
"question": "什么是景深?如何控制景深来突出主体?",
|
||
"answer": "景深是指画面中清晰成像的前后距离范围。控制方法:1.光圈越大(f值越小),景深越浅,背景虚化越明显;2.焦距越长,景深越浅;3.拍摄距离越近,景深越浅。实际应用中,人像摄影常用大光圈(如f/1.8)配合中长焦镜头,让主体清晰而背景虚化,突出人物。"
|
||
},
|
||
{
|
||
"question": "说说你对'黄金时刻'的理解,以及如何利用它进行拍摄?",
|
||
"answer": "黄金时刻指日出后和日落前各约一小时的时间,此时阳光角度低,光线柔和温暖,色温偏暖调。利用方法:1.逆光拍摄制造轮廓光和光晕效果;2.侧光突出纹理和立体感;3.利用长影子增加画面层次。需提前踩点,把握好时间窗口,准备好反光板补光。"
|
||
},
|
||
{
|
||
"question": "在室内人像摄影中,如何使用闪光灯避免生硬的光线?",
|
||
"answer": "1.使用柔光罩或柔光伞扩散光线;2.将闪光灯对准天花板或墙壁进行反射闪光;3.使用多灯布置,降低单灯功率;4.离机闪光,避免正面直闪;5.混合自然光,闪光灯作为补光;6.调节闪光灯输出功率,使用TTL自动测光。这些方法能让光线更自然柔和。"
|
||
},
|
||
{
|
||
"question": "视频拍摄中的帧率选择有什么讲究?24fps、30fps、60fps各适合什么场景?",
|
||
"answer": "24fps:电影感,适合叙事性内容、MV、广告片;30fps:电视标准,适合新闻、纪录片、访谈节目;60fps:流畅度高,适合体育赛事、动作场面、慢动作素材(后期可降速到24/30fps获得流畅慢镜头)。选择时考虑播放平台标准和创作意图。"
|
||
},
|
||
{
|
||
"question": "什么是LOG格式?为什么专业摄影师喜欢用它?",
|
||
"answer": "LOG是对数曲线记录格式,能保留更多高光和暗部细节,提供更大的后期调色空间。优势:1.动态范围更宽,可达14档;2.避免高光溢出和暗部死黑;3.后期调色灵活性高;4.适合多机位匹配。缺点是直出画面灰暗,必须后期调色,需要更多存储空间。"
|
||
},
|
||
{
|
||
"question": "如何理解和运用色彩理论来增强视觉叙事?",
|
||
"answer": "色彩理论包括色轮、互补色、类似色等概念。运用方法:1.冷暖对比营造情绪(暖色活力、冷色忧郁);2.互补色创造视觉冲击(橙蓝、黄紫);3.单色调营造统一氛围;4.色彩进退感控制空间层次;5.品牌色保持视觉识别。实际中通过服装、道具、灯光色温、后期调色等手段实现。"
|
||
},
|
||
{
|
||
"question": "拍摄运动物体时,如何选择快门速度?",
|
||
"answer": "基本原则:冻结动作需要高速快门,动感模糊需要慢速快门。具体建议:1.体育运动:1/500s以上;2.飞鸟:1/1000s以上;3.车辆追焦:1/60-1/125s配合镜头跟随;4.流水瀑布:1/4s或更慢呈现丝绸效果;5.星轨:数分钟到数小时曝光。需配合ISO和光圈保证正确曝光。"
|
||
},
|
||
{
|
||
"question": "谈谈你对'讲故事'在商业摄影中的重要性的理解。",
|
||
"answer": "商业摄影不仅是记录产品,更要传达品牌价值和情感连接。故事性体现在:1.场景构建展现使用情境;2.人物互动传递情感;3.系列作品呈现完整叙事;4.细节特写强化产品卖点;5.氛围营造引发共鸣。好的商业摄影让观众产生代入感,激发购买欲望,提升品牌认同。"
|
||
},
|
||
{
|
||
"question": "如何准备一次商业拍摄项目?请列出你的工作流程。",
|
||
"answer": "1.需求沟通:了解品牌定位、目标受众、使用场景;2.创意提案:情绪板、分镜脚本、参考样片;3.预算制定:设备、场地、模特、道具费用;4.前期筹备:场地勘景、模特选择、道具准备、拍摄排期;5.拍摄执行:设备调试、现场指导、及时回看确认;6.后期制作:选片、修图/剪辑、调色、输出;7.交付跟进:客户反馈、修改调整、最终交付。每个环节都需要细致规划和充分沟通。"
|
||
}
|
||
]
|
||
|
||
# 读取mock文件
|
||
mock_file = 'src/mocks/resumeInterviewMock.js'
|
||
with open(mock_file, 'r', encoding='utf-8') as f:
|
||
content = f.read()
|
||
|
||
# 创建备份
|
||
backup_file = f"{mock_file}.backup_photography_{datetime.now().strftime('%Y%m%d_%H%M%S')}"
|
||
with open(backup_file, 'w', encoding='utf-8') as f:
|
||
f.write(content)
|
||
print(f"已创建备份:{backup_file}")
|
||
|
||
# 查找摄影/摄像产业位置
|
||
search_start = '"name": "摄影/摄像"'
|
||
start_pos = content.find(search_start)
|
||
|
||
if start_pos == -1:
|
||
print("未找到摄影/摄像产业")
|
||
exit(1)
|
||
|
||
# 找到positions数组
|
||
positions_pos = content.find('"positions":', start_pos)
|
||
if positions_pos == -1:
|
||
print("未找到positions字段")
|
||
exit(1)
|
||
|
||
# 找到第一个position对象中的questions
|
||
first_position = content.find('{', positions_pos + 12)
|
||
if first_position == -1:
|
||
print("未找到position对象")
|
||
exit(1)
|
||
|
||
# 找到questions数组
|
||
questions_pos = content.find('"questions":', first_position)
|
||
if questions_pos == -1:
|
||
print("未找到questions字段")
|
||
exit(1)
|
||
|
||
# 找到questions数组的开始和结束
|
||
array_start = content.find('[', questions_pos)
|
||
if array_start == -1:
|
||
print("未找到questions数组")
|
||
exit(1)
|
||
|
||
# 找到对应的结束括号
|
||
bracket_count = 0
|
||
in_string = False
|
||
escape_next = False
|
||
array_end = array_start
|
||
|
||
for i in range(array_start, len(content)):
|
||
char = content[i]
|
||
|
||
if escape_next:
|
||
escape_next = False
|
||
continue
|
||
|
||
if char == '\\':
|
||
escape_next = True
|
||
continue
|
||
|
||
if char == '"' and not in_string:
|
||
in_string = True
|
||
elif char == '"' and in_string:
|
||
in_string = False
|
||
elif not in_string:
|
||
if char == '[':
|
||
bracket_count += 1
|
||
elif char == ']':
|
||
bracket_count -= 1
|
||
if bracket_count == 0:
|
||
array_end = i
|
||
break
|
||
|
||
# 构建新的questions数组
|
||
sub_questions = []
|
||
for idx, qa in enumerate(questions, 1):
|
||
sub_question = {
|
||
"id": f"q{idx}",
|
||
"question": qa['question'].replace('"', '\\"'),
|
||
"answer": qa['answer'].replace('"', '\\"')
|
||
}
|
||
sub_questions.append(sub_question)
|
||
|
||
# 创建新的questions结构
|
||
new_questions = [{
|
||
"id": "group_q1",
|
||
"question": "# 摄影/摄像面试题",
|
||
"subQuestions": sub_questions
|
||
}]
|
||
|
||
# 生成JSON字符串
|
||
new_json = json.dumps(new_questions, ensure_ascii=False, indent=10)
|
||
# 调整缩进
|
||
lines = new_json.split('\n')
|
||
adjusted_lines = []
|
||
for line in lines:
|
||
if line.strip():
|
||
adjusted_lines.append(' ' + line)
|
||
new_json = '\n'.join(adjusted_lines).strip()
|
||
|
||
# 替换内容
|
||
new_content = content[:array_start] + new_json + content[array_end+1:]
|
||
|
||
# 写入文件
|
||
with open(mock_file, 'w', encoding='utf-8') as f:
|
||
f.write(new_content)
|
||
|
||
# 验证语法
|
||
result = os.popen(f'node -c {mock_file} 2>&1').read()
|
||
if result:
|
||
print(f"❌ 语法错误,恢复备份")
|
||
with open(backup_file, 'r', encoding='utf-8') as f:
|
||
content = f.read()
|
||
with open(mock_file, 'w', encoding='utf-8') as f:
|
||
f.write(content)
|
||
print("已恢复备份")
|
||
else:
|
||
print("✓ 语法验证通过")
|
||
print("成功更新摄影/摄像的16个面试题!") |