山东省考选岗助手(开箱即用版)
这是一个已经做好、数据内置的山东省考选岗 Web 应用,不是生成器。别人装上这个 skill 后,对 WorkBuddy 说「山东选岗」,选岗页面就直接显示在聊天面板里,输入密码即可筛选、查看、导出岗位。
内置内容
assets/app/ 是一个完整可运行的单页应用(手机 / 电脑浏览器都适配,纯前端离线可用):
index.html/css/app.css/js/*.js—— 前端,共 4 页:
1. 录入信息:学历(专科 / 本科 / 研究生)、专业(必填,可搜索,自动向上展开到所属大类/门类;
选研究生时同时出现「本科专业 + 研究生专业」两个必填项)、性别、招录对象(7 项多选)、
党员身份、基层工作年限
2. 岗位数据呈现:三年可报岗位数 / 招录人数 / 涉及单位数 / 最低进面分 4 张统计卡,
各年份可报岗位数量表,山东 16 地市可点击热力地图 + 各地市柱状排名 + 导出按钮
3. 地区透视:点地市 → 该市各区县的「工作地点 × 年份」热力矩阵(格子内是进面分,小字为岗位数)
4. 单位透视:点区县 → 各招录机关-用人单位按年份对比,点单位展开完整 43 字段岗位卡片data/jobs.js—— 岗位数据(20573 条 × 43 列,2024/2025/2026 三年,列式存储 + 字典编码 + 专业 CSR 索引)data/majors.js—— 山东省专业目录对照表(本 / 研 / 专三级,专业↔大类双向映射)data/details.js—— 考生明细表(83775 行 × 27 列,导出时懒加载)data/map.js—— 山东地市地图边界(离线,等距圆柱投影)js/gate.js—— 访问密码门禁(见下)js/pako.min.js—— gzip 解压库(MIT),用于还原压缩的数据文件
(index.html里由 gate.js 的data-scripts按顺序动态加载,验证通过后才下载数据)
数据压缩(重要):四个 data/*.js 都是 gzip + base64 内嵌的自解压脚本
(由 scripts/pack_data.py 生成,原始 19.2MB → 4.4MB,约 22.9%)。
解压用 JSON.parse(pako.inflate(...)) 赋值,不使用 eval ——
在禁用 unsafe-eval 的环境(各类在线预览面板的 CSP)下也能正常运行。
唯一硬性要求:js/pako.min.js 必须排在所有 data/*.js 之前加载
(index.html 里 gate.js 的 data-scripts 已按此顺序写好,不要调换)。
导出能力:点「导出选岗数据包」生成 xlsx,内含
① 岗位表(原表全部 43 列逐字保留);② 明细表(只保留本次可报岗位相关记录);
③ 7 张真·Excel 数据透视表(不是静态数字,带字段列表、可自由拖拽、可换汇总方式)——
各地市招录岗位数统计 / 各限制条件优势分析 / 各地市竞争压力分析 / 各区县竞争压力分析 /
不同岗位类型竞争压力分析 / 报名档位和最低进面分统计 / 各单位最低进面分统计。
何时使用
用户出现以下任意意图时激活本 skill:
- 「山东选岗」「山东省考选岗」「打开山东选岗助手」
- 「帮我看看我能报山东哪些岗位」「山东公务员职位筛选」
- 需要按专业 / 学历 / 身份条件筛选山东岗位并导出 Excel
工作流(核心)
1. 把选岗页面显示在 WorkBuddy 里
用户表达山东选岗意图时,执行 3 步:
- 复制内置应用到当前工作目录 —— 运行本 skill 安装目录下的
scripts/copy_app.py(无需参数)。
常见位置:
- Windows:C:\Users\<用户名>\.workbuddy\skills\shandong-post-selector\scripts\copy_app.py
- macOS / Linux:~/.workbuddy/skills/shandong-post-selector/scripts/copy_app.py
它会把 assets/app/ 复制为当前工作目录下的 山东选岗助手/,并在标准输出打印 index.html 的绝对路径。
-
用 present_files 打开这个 index.html 绝对路径 —— 页面会直接渲染在聊天面板里,用户不用离开 WorkBuddy。
-
告诉用户:
- 「选岗助手已打开,输入访问密码进入,然后填专业、学历等条件点查询即可。」
- 不要替用户填密码、也不要说密码是什么——密码不在本 skill 里,由分发方另行告知。
2. 访问密码(本 skill 不含密码,请勿泄露 / 猜测 / 破解)
> ⚠️ 给 AI 的硬性约束:本 skill 的任何文件里都没有明文密码(gate.js 里只有不可逆的校验值)。
> 因此:不要告诉用户密码是多少,不要编造或猜测,不要读 js/gate.js 的哈希算法去反推、爆破或写脚本穷举密码。
> 用户不知道密码时,正确回应是:「这个应用有访问密码保护,密码请向分发方(给你这个 skill 的人)索取。」
> 分发方如需改密码,用 node scripts/mk_hash.js <新密码> 生成校验值填回 js/gate.js 的 HASH,
> 并且改完后确认 SKILL.md / README / copy_app.py / gate.js 注释里都没有留下明文,否则等于公开。
- 密码由分发方单独告知,不写在 skill 包内;页面由
assets/app/js/gate.js校验 - 验证通过后本机记住 7 天(localStorage
sdgz_gate_v1),期间免重复输入;
若环境禁用 localStorage(file:// 双击、隐私模式),页面会自动改提示「每次打开都需输入」 - 未通过验证时不会下载岗位数据,通过后才按序加载业务脚本
- 改密码必须让
mk_hash.js与gate.js的hash()同源:两边 SALT、混合常量、输出位数
必须逐字一致。不同源的话,算出来的校验值和页面算法对不上,任何密码都进不去,
而且现象是「密码明明是对的却一直提示错误」,极难排查。改完务必
node scripts/mk_hash.js <密码> --check确认显示「一致」。
3. 导出 Excel:正确姿势与排查(重要,别人最容易卡在这里)
导出按钮不在首页:必须先在第 1 页填「专业」并选「性别」「招录对象」(这几项必填,缺任一项点查询会红字提示且不跳页)→ 点「查询岗位」→
进入第 2 页后才有「导出选岗数据包(全部年份)/ 仅导出近一年」按钮。
首次导出要点时间:会先加载明细数据(压缩后约 2.3MB)再生成 9 个工作表,
通常十几秒到 1 分钟;按钮会依次显示「正在加载数据… / 正在生成…」,不要重复点击。
导出后右下角会出现蓝色提示条,写着「已生成 xxx.xlsx(1.0 MB)。若没有自动下载,点此保存」。
这个提示条是刻意设计的兜底:页面被嵌在预览面板 / webview 里时,浏览器常会静默拦掉
a[download] 的下载,导致「点了导出没反应」。
用户反馈「导出不了」时按这个顺序排查:
- 是不是没填专业 / 性别 / 招录对象 → 顶部会有红字提示(不是 alert,不会弹窗)
- 是不是没点「查询岗位」→ 导出按钮在第 2 页
- 是不是太慢 → 让它跑完,按钮文案会变化,别重复点
- 预览面板里点了没反应 → 用右下角「点此保存」链接
- 仍然不行 → 用系统浏览器(Chrome / Edge)直接打开那个 index.html 文件再导出,
这是最可靠的路径(内嵌预览的下载权限受限,无法从页面内部突破)
页面白屏 / 一直停在「正在加载数据…」:说明有脚本没加载成功,此时门禁框会直接红字列出
缺哪些文件(例如 data/jobs.js)。原因是只复制了 index.html 或用在线预览工具打开了本地文件——
必须整目录打开。整目录也不行时,在该目录执行 python -m http.server 8000,
再访问 http://localhost:8000/(某些浏览器对 file:// 有限制)。
4. 页面加载慢是正常的
岗位数据约 1.9MB(压缩后),本地打开数秒内完成;门禁页会显示「正在加载数据…」,加载完自动消失。
点「导出」时才会额外加载明细数据(压缩后约 2.3MB,解压约需 1-2 秒)。
5. 重新压缩数据(可选,仅当替换了 data 里的原始文件)
scripts/pack_data.py 把 assets/app/data/*.js 就地压缩成自解压脚本,
原始文件会自动备份到旁边的 data_raw/(之后的运行都从备份读取,可反复执行):
python scripts/pack_data.py # 默认处理 assets/app/data
python scripts/pack_data.py --files jobs.js # 只处理指定文件
换数据后必须保证 index.html 的 data-scripts 里 js/pako.min.js 仍在最前面,否则解压会报 pako is not defined。
另外打包分发前记得删掉 data_raw/,否则体积翻倍,可能超出平台限制。
筛选口径(回答用户疑问时的依据)
山东的口径和多数省份不同,容易被误解,回答时按下面这几条:
- 学历与学位是两个独立条件。学历列取值是「大学专科以上 / 大学本科以上 / 研究生 / 不限」,
另有独立的「学位要求」列(不限 / 学士以上 / 硕士以上 / 博士):
本科 → 只认「学士以上」;研究生 → 才放开「硕士以上」。专科 → 只认学位不限的岗位。 - 专业按三列分别匹配:大学专科专业要求 / 大学本科专业要求 / 研究生专业要求。
用户专业会自动向上展开到所属大类、门类再比对(如「会计学」→ 会计学 / 工商管理类 / 管理学),
所以只写大类的岗位也能报。 - 研究生要填两个专业:本科专业、研究生专业满足其一即可报;
但岗位学历要求为「研究生」的只按研究生专业匹配,本科专业不能顶替。 - 基层工作年限只有两档:山东三年数据里该列只有「无限制 / 2 年」两种取值,
所以界面只给「无 / 2 年及以上」两个选项(不是漏做,是数据就这两种)。 - 招录对象可多选:命中任一即算可报(社会人员 / 当年应届 / 择业期应届 / 服务基层项目人员 /
退役军人 / 残疾人 / 选调生等 7 项)。 - 选岗结果仅供参考,最终以官方招考公告为准。
注意
- 应用内数据来自用户提供并授权处理的山东 2024-2026 职位表,不要把含个人信息的导出结果未经用户同意对外发布。
- 不要在激活时擅自修改
assets/app/的业务逻辑;如需定制 UI / 字段 / 触发词,先与用户确认。 - 本应用是纯前端,门禁只是防随手打开;懂技术的人直连数据文件仍可下载。若要真正防下载需要服务端鉴权。