Merge branch 'feature/multi-process' of github.com-geekgeekrun:geekgeekrun/geekgeekrun into feature/multi-process

This commit is contained in:
geekgeekrun
2026-02-10 18:51:03 +08:00
18 changed files with 455 additions and 334 deletions

View File

@@ -0,0 +1,4 @@
[
"青钱","软通动力","南天","睿服","中电金信","佰钧成","云链","博彦","汉克时代","柯莱特","拓保","亿达信息","纬创","微创","微澜","诚迈科技","法本","兆尹","诚迈","联合永道","新致软件","宇信科技","华为","德科","FESCO","科锐","科之锐",
"抖音","字节","字跳","有竹居","脸萌","头条","懂车帝","滴滴","嘀嘀","巨量引擎","小桔","网易","有道","腾讯","酷狗","酷我","阅文","搜狗","小鹅通","富途","京东","沃东天骏","达达","达冠","百度","昆仑芯","小度","度小满","爱奇艺","携程","趣拿","去哪儿","集度","智图","长地万方","瑞图万方","道道通","小熊博望","理想","蔚来","顺丰","丰巢","中通","圆通","申通","跨越","讯飞","同程","艺龙","马蜂窝","贝壳","自如","链家","我爱我家","相寓","多点","金山","小米","猎豹","新浪","微博","阿里","淘宝","淘麦郎","天猫","盒马","口碑","优视","夸克","UC","蚂蚁","高德","LAZADA","来赞达","飞猪","菜鸟","哈啰","钉钉","乌鸫","饿了么","美团","三快","猫眼","快手","映客","小红书","行吟","奇虎","360","三六零","鸿盈","奇富","奇元","亚信","启明星辰","奇安信","深信服","长亭","绿盟","天融信","商汤","SenseTime","大华","海康威视","hikvision","汽车之家","车好多","瓜子","易车","昆仑万维","昆仑天工","闲徕","趣加","FunPlus","完美","马上消费","轻松","水滴","白龙马","58","车欢欢","五八","红布林","致美","快狗","天鹅到家","转转","美餐","知乎","智者四海","易点云","搜狐","用友","畅捷通","猿辅导","小猿","猿力","好未来","学而思","希望学","新东方","东方甄选","东方优选","作业帮","高途","跟谁学","学科网","天学网","一起教育","一起作业","美术宝","火花思维","粉笔","51talk","爱学习","高思","老虎国际","一心向上","向上一意","联想","拉勾","乐视","欢聚","竞技世界","拼多多","寻梦","从鲸","TEMU","得物","有赞","Moka","希瑞亚斯","北森","OPPO","欧珀","vivo","维沃","小天才","步步高","读书郎","货拉拉","陌陌","探探","Shopee","虾皮","首汽租车","GoFun","神州租车","天眼查","旷视","小冰","美图","智谱华章","MiniMax","石头科技","迅雷","TP","锐捷","Tenda","腾达","斐讯","希音","SHEIN","稀宇","深言","百川智能","与爱为舞","牵手","Grab","爱回收","洋钱罐","瓴岳","得到","思维造物","地平线","咪咕","翼支付","电信","天翼","联通","蓝湖","墨刀","海尔","美的","米哈游","传音","同花顺","国美","TCL"
]

View File

@@ -1,4 +1 @@
[
"青钱","软通动力","南天","睿服","中电金信","佰钧成","云链","博彦","汉克时代","柯莱特","拓保","亿达信息","纬创","微创","微澜","诚迈科技","法本","兆尹","诚迈","联合永道","新致软件","宇信科技","华为","德科","FESCO","科锐","科之锐",
"抖音","字节","字跳","有竹居","脸萌","头条","懂车帝","滴滴","嘀嘀","巨量引擎","小桔","网易","有道","腾讯","酷狗","酷我","阅文","搜狗","小鹅通","富途","京东","沃东天骏","达达","达冠","百度","昆仑芯","小度","度小满","爱奇艺","携程","趣拿","去哪儿","集度","智图","长地万方","瑞图万方","道道通","小熊博望","理想","蔚来","顺丰","丰巢","中通","圆通","申通","跨越","讯飞","同程","艺龙","马蜂窝","贝壳","自如","链家","我爱我家","相寓","多点","金山","小米","猎豹","新浪","微博","阿里","淘宝","淘麦郎","天猫","盒马","口碑","优视","夸克","UC","蚂蚁","高德","LAZADA","来赞达","飞猪","菜鸟","哈啰","钉钉","乌鸫","饿了么","美团","三快","猫眼","快手","映客","小红书","行吟","奇虎","360","三六零","鸿盈","奇富","奇元","亚信","启明星辰","奇安信","深信服","长亭","绿盟","天融信","商汤","SenseTime","大华","海康威视","hikvision","汽车之家","车好多","瓜子","易车","昆仑万维","昆仑天工","闲徕","趣加","FunPlus","完美","马上消费","轻松","水滴","白龙马","58","车欢欢","五八","红布林","致美","快狗","天鹅到家","转转","美餐","知乎","智者四海","易点云","搜狐","用友","畅捷通","猿辅导","小猿","猿力","好未来","学而思","希望学","新东方","东方甄选","东方优选","作业帮","高途","跟谁学","学科网","天学网","一起教育","一起作业","美术宝","火花思维","粉笔","51talk","爱学习","高思","老虎国际","一心向上","向上一意","联想","拉勾","乐视","欢聚","竞技世界","拼多多","寻梦","从鲸","TEMU","得物","有赞","Moka","希瑞亚斯","北森","OPPO","欧珀","vivo","维沃","小天才","步步高","读书郎","货拉拉","陌陌","探探","Shopee","虾皮","首汽租车","GoFun","神州租车","天眼查","旷视","小冰","美图","智谱华章","MiniMax","石头科技","迅雷","TP","锐捷","Tenda","腾达","斐讯","希音","SHEIN","稀宇","深言","百川智能","与爱为舞","牵手","Grab","爱回收","洋钱罐","瓴岳","得到","思维造物","地平线","咪咕","翼支付","电信","天翼","联通","蓝湖","墨刀","海尔","美的","米哈游","传音","同花顺","国美","TCL"
]
[]

View File

@@ -1,7 +1,7 @@
{
"name": "geekgeekrun-ui",
"version": "0.14.2",
"description": "Boss 炸弹 - 自动开聊Boss,助力每位打工人求职!",
"description": "BOSS 炸弹 - 自动开聊BOSS,助力每位打工人求职!",
"main": "./out/main/index.js",
"author": "geekgeekrun",
"productName": "GeekGeekRun",

View File

@@ -133,7 +133,7 @@ const runAutoChat = async () => {
await dialog.showMessageBox({
type: `error`,
message: `登录状态无效`,
detail: `请重新登录Boss直聘`
detail: `请重新登录BOSS直聘`
})
process.exit(AUTO_CHAT_ERROR_EXIT_CODE.LOGIN_STATUS_INVALID)
break

View File

@@ -264,6 +264,11 @@ const mainLoop = async () => {
bossCookies = readStorageFile('boss-cookies.json')
cookieCheckResult = checkCookieListFormat(bossCookies)
} catch (err) {
await dialog.showMessageBox({
type: `error`,
message: `登录状态无效`,
detail: `请重新登录BOSS直聘`
})
sendToDaemon({
type: 'worker-to-gui-message',
data: {
@@ -314,7 +319,7 @@ const mainLoop = async () => {
await dialog.showMessageBox({
type: `error`,
message: `登录状态无效`,
detail: `请重新登录Boss直聘`
detail: `请重新登录BOSS直聘`
})
sendToDaemon({
type: 'worker-to-gui-message',

View File

@@ -5,7 +5,7 @@
<el-col :span="6"><el-form-item label="公司">{{ jobInfo.companyName }}</el-form-item></el-col>
<el-col :span="6"><el-form-item label="职位名称">{{ jobInfo.jobName }}</el-form-item></el-col>
<el-col :span="6"><el-form-item label="职位分类">{{ jobInfo.positionName }}</el-form-item></el-col>
<el-col :span="6"><el-form-item label="Boss及其身份">{{ jobInfo.bossName }} {{ jobInfo.bossTitle }}</el-form-item></el-col>
<el-col :span="6"><el-form-item label="BOSS及其身份">{{ jobInfo.bossName }} {{ jobInfo.bossTitle }}</el-form-item></el-col>
</el-row>
</el-form>
<el-divider content-position="left">变更记录</el-divider>

View File

@@ -4,11 +4,12 @@
<el-form ref="formRef" :model="formData" :rules="rules" flex flex-col of-hidden h-full>
<div class="bg-#f6f6f6" flex-0>
<el-form-item
class="w-80%"
class="w-90%"
label="浏览器可执行文件路径"
label-position="top"
prop="browserPath"
pt50px
pb50px
pt30px
pb30px
ml-auto
mr-auto
mb-0
@@ -21,17 +22,19 @@
@click="autoDetectPuppeteerExecutable"
>自动检测</el-button
>
<el-button :style="{ marginLeft: 0 }" @click="browserExecutableFile">浏览</el-button>
<el-button :style="{ marginLeft: 0 }" @click="chooseExecutableFile"
>手动选择</el-button
>
</div>
</el-form-item>
</div>
<div flex-1 of-auto font-size-14px line-height-1.5em>
<div mt10px ml-auto mr-auto class="w-80%">
<div mt10px ml-auto mr-auto class="w-90%">
<div>常见问题</div>
<div>
<details>
<summary>不能自动检测到浏览器</summary>
<div ml12px class="color-#666">
<div class="faq-main">
<details class="faq-item">
<summary>自动检测点击后提示未检测到可用浏览器的可执行文件</summary>
<div class="faq-answer">
请尝试如下方案之一来处理
<ul pl1em m0>
<li>
@@ -55,7 +58,8 @@
:loading="isAutoDetectLoading"
@click="autoDetectPuppeteerExecutable"
>自动检测</a
>按钮再次尝试目前2026.2.7已知 Chrome 最新版本为 144.0.7559.133
>按钮再次尝试截至本程序开发时2026.2.7Google Chrome 最新版本为
144.0.7559.133
多数情况下本程序都可以正常工作但由于浏览器会自动升级版本不固定可能存在<span
color-orange
>浏览器升级后某些功能不兼容导致本程序不能正确运行</span
@@ -68,6 +72,101 @@
</ul>
</div>
</details>
<details class="faq-item">
<summary>
如果要手动选择浏览器可选择的浏览器有哪些对于浏览器有什么要求
</summary>
<div class="faq-answer">
<div>
截至本程序开发时2026.2.7已确定支持的各操作系统下的浏览器及版本包括
</div>
<ul>
<li>
<div>macOS</div>
<ul>
<li>Google Chrome for Testing {{ EXPECT_CHROMIUM_BUILD_ID }}</li>
<li>Google Chrome 144.0.7559.133</li>
<li>Microsoft Edge 144.0.3719.115</li>
</ul>
</li>
<li>
<div>Windows</div>
<ul>
<li>Google Chrome for Testing {{ EXPECT_CHROMIUM_BUILD_ID }}</li>
<li>Google Chrome 144.0.7559.133</li>
<li>Microsoft Edge 144.0.3719.93</li>
<li>Opera 127.0.5778.14基于 Chromium 143.0.7499.194</li>
<li>Yandex Browser 25.12.3.1126 基于 Chromium 142.0.7444.1126</li>
</ul>
</li>
<li>
<div>Linux (Ubuntu)</div>
<ul>
<li>Google Chrome for Testing {{ EXPECT_CHROMIUM_BUILD_ID }}</li>
</ul>
</li>
</ul>
<div>
下列浏览器可以使用但由于Chromium内核版本低于本程序设置的版本可能存在潜在问题不一定能完全支持所有功能你可以尝试进行配置
</div>
<ul>
<li>
<div>Windows</div>
<ul>
<li>360 安全浏览器 16.1.2552.64 基于 Chromium 132.0.6834.83</li>
<li>360 极速浏览器X 23.1.1187.64 基于 Chromium 132.0.6805.0</li>
<li>夸克 6.4.0.728 基于 Chromium 130.0.6723.44</li>
</ul>
</li>
</ul>
<div>下列浏览器经过测试已明确不可用</div>
<ul>
<li>
<div>Windows</div>
<ul>
<li>QQ 浏览器 20.1.0 基于 Chromium 116.0.5845.97</li>
<li>搜狗高速浏览器 13.8 基于 Chromium 116.0.5845.97</li>
<li>猎豹浏览器基于 Chromium 112.0.5615.138</li>
<li>Brave 1.86.148 基于 Chromium 144.0.7559.133</li>
</ul>
</li>
</ul>
<div>
本程序目前仅支持 Chromium 内核浏览器因此 SafariFirefoxWindows Internet
Explorer旧版 Microsoft Edge <span color-orange
>非Chromium内核浏览器无法使用</span
>同时对于 Chromium 内核浏览器本程序<span color-orange
>仅支持
{{ EXPECT_CHROMIUM_BUILD_ID }}
或更高内核版本</span
>你可以打开在你想要尝试的浏览器访问 chrome://version” 找到 “用户代理” /
User Agent 行来查看当前浏览器的内核版本<br />
目前大部分中国大陆厂商发布的基于Chromium内核的浏览器均由于版本过低不被本程序支持
</div>
</div>
</details>
<details class="faq-item">
<summary>如果我选择了一个不支持的浏览器会发生什么</summary>
<div class="faq-answer">
<div>可能会发生的情况</div>
<ul>
<li>浏览器将会启动但会开启一个空白页面之后浏览器不会做任何事</li>
<li>浏览器启动失败你不会看到任何界面</li>
<li>浏览器会每隔一段时间打开一个新的浏览器窗口</li>
</ul>
</div>
</details>
<details class="faq-item">
<summary>如果我选择了一个不是浏览器的可执行文件会发生什么</summary>
<div class="faq-answer">
<div>可能会发生的情况</div>
<ul>
<li>可执行文件将会启动但会开启一个空白页面之后可执行文件不会做任何事</li>
<li>可执行文件闪退并报错闪退后会自动重启继续报错</li>
<li>可执行文件会不断运行多个实例</li>
</ul>
</div>
</details>
</div>
</div>
</div>
@@ -78,7 +177,7 @@
:style="{
display: 'flex',
justifyContent: 'end',
width: '80%',
width: '90%',
margin: '0 auto',
paddingLeft: '',
paddingRight: ''
@@ -100,7 +199,7 @@
<script lang="ts" setup>
import { useRouter } from 'vue-router'
import { ref } from 'vue'
import { nextTick, ref } from 'vue'
import debounce from 'lodash/debounce'
import { ElMessage } from 'element-plus'
import { gtagRenderer as baseGtagRenderer } from '@renderer/utils/gtag'
@@ -172,12 +271,14 @@ async function autoDetectPuppeteerExecutable() {
type: 'success',
grouping: true
})
await nextTick()
await formRef.value.validateField()
} finally {
isAutoDetectLoading.value = false
}
}
async function browserExecutableFile() {
async function chooseExecutableFile() {
const chooseResult = await ipcRenderer.invoke('choose-file', {
fileChooserConfig: {
properties: ['openFile', 'treatPackageAsDirectory'],
@@ -194,6 +295,8 @@ async function browserExecutableFile() {
return
}
formData.value.browserPath = chooseResult.filePaths[0]
await nextTick()
await formRef.value.validateField()
}
ipcRenderer.invoke('get-last-used-and-available-browser').then((res) => {
@@ -239,4 +342,21 @@ a:hover,
a:active {
color: #409eff;
}
.faq-main {
.faq-item {
summary {
padding: 4px 0;
}
.faq-answer {
color: #666;
margin-left: 12px;
ul {
margin-top: 0;
margin-bottom: 0;
padding-left: 1em;
}
}
}
}
</style>

View File

@@ -1,8 +1,13 @@
<template>
<div class="h-screen of-hidden flex flex-col flex-items-center flex-justify-center">
<div>
<div>你可能是第一次安装本程序</div>
<div>正在查找可用浏览器请稍等...</div>
<div>
由于您是首次使用本程序或者您之前配置的浏览器被卸载/被删除/被移动/被更新/版本太旧因此需要重新配置浏览器
</div>
<div>
首先将尝试自动配置自动配置成功后本对话框将自动关闭如自动配置失败请在下个页面中手动配置
</div>
<div>正在尝试自动配置请稍等...</div>
</div>
</div>
</template>

View File

@@ -1,16 +1,11 @@
<template>
<div class="cookie-assistant-page">
<div ml1em mt1em mb1em font-size-16px>Boss 登录助手</div>
<el-alert
v-if="cookieInvalid"
type="warning"
:closable="false"
title="需要获取您的Boss直聘Cookie才能继续"
>
由于您是首次使用本程序或者您之前使用的Boss直聘账号登录状态失效因此您需要重新获取登录凭证
<div ml1em mt1em mb1em font-size-16px>BOSS登录助手</div>
<el-alert v-if="cookieInvalid" type="warning" :closable="false">
由于您是首次使用本程序或者您之前使用的BOSS直聘账号登录状态失效因此您需要重新获取登录凭证
</el-alert>
<div ml1em mt1em line-height-normal>
如果您了解如何获取Cookie了解有效的Cookie格式可以直接在下方输入框中进行编辑由于手动编辑较为麻烦建议您打开已登录过Boss直聘的浏览器使用<a
如果您了解如何获取Cookie了解有效的Cookie格式可以直接在下方输入框中进行编辑由于手动编辑较为麻烦建议您打开已登录过BOSS直聘的浏览器使用<a
class="color-blue! decoration-none"
href="javascript:void(0)"
@click.prevent="handleEditThisCookieExtensionStoreLinkClick"
@@ -29,14 +24,14 @@
>
启动浏览器
</li>
<li>按照正常流程通过 <b>短信验证码/二维码/微信小程序</b> 登录您的Boss直聘账号</li>
<li>按照正常流程通过 <b>短信验证码/二维码/微信小程序</b> 登录您的BOSS直聘账号</li>
<li>接下来将自动进行一些页面跳转最终将会停留在首页</li>
<li>
登录后预计5-10秒内具体取决于您的网速您的Cookie将被自动填入下方输入框
<details>
<summary color-orange cursor-pointer>我已完成登录但Cookie一直没出现</summary>
<div ml-2em max-h-200px of-auto>
如果您确实已经在打开浏览器中看到您已登录了Boss直聘请尝试按照如图所示方式复制Cookie
如果您确实已经在打开浏览器中看到您已登录了BOSS直聘请尝试按照如图所示方式复制Cookie
<figure>
<figcaption>依次点击浏览器右上角扩展程序图标EditThisCookie图标</figcaption>
<img block max-w-full src="./resources/copy-cookie-step-1.png" />
@@ -98,7 +93,7 @@
</el-form-item>
</el-form>
<footer flex mt20px pb20px flex-justify-end>
<el-button v-if="!cookieInvalid" @click="handleCancel">取消</el-button>
<el-button @click="handleCancel">取消</el-button>
<el-button type="primary" @click="handleSubmit">确定</el-button>
</footer>
</div>
@@ -210,7 +205,7 @@ const handleSubmit = async () => {
fileName: 'boss-cookies.json',
data: formContent.value.collectedCookies
})
ElMessage.success('Boss直聘 Cookie 保存成功')
ElMessage.success('BOSS直聘 Cookie 保存成功')
gtagRenderer('save_cookie_done')
window.electron.ipcRenderer.send('cookie-saved')

View File

@@ -22,8 +22,8 @@
gtagRenderer('view_boss_agreement_clicked')
}
"
>Boss直聘用户协议</el-link
>2023年3月版相关条款相违背您在注册Boss直聘时已签署过这一条款根据该条款
>BOSS直聘用户协议</el-link
>2023年3月版相关条款相违背您在注册BOSS直聘时已签署过这一条款根据该条款
<i>用户的平台使用义务</i><i>违约责任</i>
章节如果一些非正常用户行为被风控监测到您需要承受包括不仅限于<b class="color-red"
>账号被强制退出登录账号被限制使用账号被封禁</b
@@ -31,10 +31,10 @@
>且如果相关风险发生<b class="color-red">您需要自行承担相关后果本程序不负责</b>
</ElCheckbox>
<ElCheckbox :label="1" :class="[unreadItemsAfterClickSubmit[1] ? 'unread' : '']">
本程序需要存储您的登录凭据即Cookie来模拟您在Boss直聘上开聊Boss的行为本程序仅会把您的Cookie存储在本地并在您访问Boss直聘时将其传输到Boss直聘<b
本程序需要存储您的登录凭据即Cookie来模拟您在BOSS直聘上开聊BOSS的行为本程序仅会把您的Cookie存储在本地并在您访问BOSS直聘时将其传输到BOSS直聘<b
class="color-red"
>不会泄露给第三方</b
>也不会进行除自动开聊Boss以外的行为<b class="color-red">请勿向他人泄漏您的Cookie</b
>也不会进行除自动开聊BOSS以外的行为<b class="color-red">请勿向他人泄漏您的Cookie</b
>
</ElCheckbox>
<ElCheckbox :label="2" :class="[unreadItemsAfterClickSubmit[2] ? 'unread' : '']">
@@ -42,11 +42,11 @@
class="color-red"
>注意节制</b
>建议当天开聊次数用尽后隔几天再使用建议您<b class="color-red"
>注册一个本程序专用的新的Boss直聘账号</b
>注册一个本程序专用的新的BOSS直聘账号</b
>进行求职
</ElCheckbox>
<ElCheckbox :label="3" :class="[unreadItemsAfterClickSubmit[3] ? 'unread' : '']">
本程序原理是模拟用户在Boss直聘网页上寻找关键元素并进行点击操作Boss直聘网站经常<b>发生改版</b>且有可能<b>包含A/B实验</b>这将导致本程序相关脚本失效典型表现为本程序运行到某一步骤后<b
本程序原理是模拟用户在BOSS直聘网页上寻找关键元素并进行点击操作BOSS直聘网站经常<b>发生改版</b>且有可能<b>包含A/B实验</b>这将导致本程序相关脚本失效典型表现为本程序运行到某一步骤后<b
class="color-red"
>浏览器重复闪退重新启动</b
>如果您在使用过程中遇上程序未按照预期执行的情况请点击程序左下角进行反馈
@@ -81,16 +81,16 @@
</ElCheckbox>
<ElCheckbox :label="7" :class="[unreadItemsAfterClickSubmit[7] ? 'unread' : '']">
本程序<b class="color-red">不对您的求职过程与结果负责</b
>为您开聊的职位均在Boss直聘上发布职位信息真实性由Boss直聘负责<b
>为您开聊的职位均在BOSS直聘上发布职位信息真实性由BOSS直聘负责<b
class="color-red"
>自行甄别为您开聊的公司认真决定是否参加面试慎重选择Offer</b
>
</ElCheckbox>
<ElCheckbox :label="8" :class="[unreadItemsAfterClickSubmit[8] ? 'unread' : '']">
请在Boss直聘上自行<b class="color-red">屏蔽您不期望投递的公司</b
>如果您不希望您当前公司其它具有招聘账号的员工看到您在Boss直聘上活跃<b
请在BOSS直聘上自行<b class="color-red">屏蔽您不期望投递的公司</b
>如果您不希望您当前公司其它具有招聘账号的员工看到您在BOSS直聘上活跃<b
class="color-red"
>在Boss直聘上屏蔽当前公司及与之关联的公司</b
>在BOSS直聘上屏蔽当前公司及与之关联的公司</b
>
</ElCheckbox>
<ElCheckbox :label="9" :class="[unreadItemsAfterClickSubmit[9] ? 'unread' : '']">

View File

@@ -3,7 +3,7 @@
<FlyingCompanyLogoList class="flying-company-logo-list" />
<div class="tip">
<article>
<h1>👋 BOSS炸弹正在运行</h1>
<h1>👋 自动开聊正在运行</h1>
<p>💬 正在为你开聊BOSS请静候佳音</p>
<p>📱 你可以在<b>手机</b> / <b>平板电脑</b>使用BOSS直聘App与为你开聊的BOSS聊天</p>
<p>🍀 祝你求职顺利</p>

View File

@@ -3,7 +3,7 @@
<FlyingCompanyLogoList class="flying-company-logo-list" />
<div class="tip">
<article>
<h1>👋 已读不回提醒器正在运行</h1>
<h1>👋 已读不回自动复聊正在运行</h1>
<p>🍀 祝你求职顺利</p>
</article>
<el-button :disabled="isStopping" @click="handleStopButtonClick">停止开聊</el-button>

View File

@@ -10,25 +10,6 @@
<div class="form-wrap geek-auto-start-run-with-boss">
<el-form ref="formRef" :model="formContent" label-position="top" :rules="formRules">
<el-card class="config-section">
<div flex>
<el-form-item>
<div>
<div font-size-14px>BOSS直聘 Cookie</div>
<el-button size="small" type="primary" @click="handleClickLaunchLogin"
>编辑Cookie</el-button
>
</div>
</el-form-item>
<div w1px class="bg-#dee1e8" ml16px mr16px />
<el-form-item>
<div>
<div font-size-14px>浏览器</div>
<el-button size="small" type="primary" @click="handleClickBrowserSetting"
>编辑浏览器设置</el-button
>
</div>
</el-form-item>
</div>
<div>
<div font-size-14px>
摸鱼模式
@@ -39,7 +20,7 @@
>
<template #content>
<div>
本程序运行较长时间后Boss直聘会对账号进行风控导致本程序不能继续执行<br />
本程序运行较长时间后BOSS直聘会对账号进行风控导致本程序不能继续执行<br />
为此加入摸鱼模式通过此配置主动减慢本程序的运行速度降低潜在的被风控监测到的概率<br />
你可以自定义开启摸鱼模式的频率 - 默认为操作100次后暂停运行15分钟
</div>
@@ -129,7 +110,7 @@
<div w-full>
<div ref="jobSourceFormItemSectionEl" font-size-16px>
<div>
你想投递Boss直聘上哪些列表里的职位
你想投递BOSS直聘上哪些列表里的职位
<el-tooltip
effect="light"
placement="bottom-start"
@@ -142,7 +123,7 @@
</template>
<el-button type="text" font-size-12px
><span><QuestionFilled w-1em h-1em mr2px /></span
>下方展示的各条目与Boss直聘界面对应关系是怎样的</el-button
>下方展示的各条目与BOSS直聘界面对应关系是怎样的</el-button
>
</el-tooltip>
</div>
@@ -159,7 +140,7 @@
<el-form-item prop="filter" mt18px mb0px w-full>
<div flex-1>
<div font-size-16px>
你希望Boss直聘为你筛选出什么样的职位
你希望BOSS直聘为你筛选出什么样的职位
<el-tooltip
effect="light"
placement="bottom-start"
@@ -168,7 +149,7 @@
<template #content>
<ul m0 line-height-1.5em w-540px pl2em>
<li>
这个配置决定了下面列表中会展示哪些职位查找职位时会在Boss直聘页面上自动组合下方设置的筛选条件对应UI<br />
这个配置决定了下面列表中会展示哪些职位查找职位时会在BOSS直聘页面上自动组合下方设置的筛选条件对应UI<br />
<img h-270px src="../resources/intro-of-job-filter-auto-change.png" />
</li>
<li color-orange>
@@ -306,6 +287,7 @@
:autosize="{ minRows: 4 }"
max-h-8lh
type="textarea"
placeholder="置空表示“不限公司,任意公司都可以投递”"
@blur="normalizeExpectCompanies"
/>
</el-form-item>
@@ -905,7 +887,7 @@
</div>
<div>
<b>“职位类型正则”填写过程中请注意</b
>“职位类型”是由Boss直聘预定义好的一系列职位分类,因此<b>请按照这个分类来编写正则</b>。<br />
>“职位类型”是由BOSS直聘预定义好的一系列职位分类,因此<b>请按照这个分类来编写正则</b>。<br />
这个分类可以在此找到:<br />
<img w-400px src="../resources/job-type-source-entry.png" />
</div>
@@ -1164,7 +1146,7 @@ import {
formatStaticCombineFilters
} from '@geekgeekrun/geek-auto-start-chat-with-boss/combineCalculator.mjs'
import { gtagRenderer as baseGtagRenderer } from '@renderer/utils/gtag'
import defaultTargetCompanyListConf from '@geekgeekrun/geek-auto-start-chat-with-boss/default-config-file/target-company-list.json'
import sampleCompanyList from '@geekgeekrun/geek-auto-start-chat-with-boss/default-config-file/sample-company-list.json'
import { ArrowDown } from '@element-plus/icons-vue'
import {
CombineRecommendJobFilterType,
@@ -1617,41 +1599,15 @@ const normalizeExpectCompanies = () => {
.join(',')
}
const handleClickLaunchLogin = async () => {
gtagRenderer('launch_login_clicked')
try {
await electron.ipcRenderer.invoke('login-with-cookie-assistant')
ElMessage({
type: 'success',
message: 'Cookie 保存成功'
})
} catch {
//
}
}
const handleClickBrowserSetting = async () => {
gtagRenderer('browser_setting_clicked')
try {
await electron.ipcRenderer.invoke('config-with-browser-assistant')
ElMessage({
type: 'success',
message: '浏览器设置保存成功'
})
} catch {
//
}
}
const expectCompanyTemplateList = [
{
name: '默认值',
value: defaultTargetCompanyListConf.join(',')
},
{
name: '不限公司(随便投)',
value: ''
},
{
name: '示例公司',
value: sampleCompanyList.join(',')
},
{
name: '大厂及关联企业',
value: `抖音,字节,字跳,有竹居,脸萌,头条,懂车帝,滴滴,嘀嘀,巨量引擎,小桔,网易,有道,腾讯,酷狗,酷我,阅文,搜狗,小鹅通,富途,京东,沃东天骏,达达,达冠,百度,昆仑芯,小度,度小满,爱奇艺,携程,趣拿,去哪儿,集度,智图,长地万方,瑞图万方,道道通,小熊博望,理想,蔚来,顺丰,丰巢,中通,圆通,申通,跨越,讯飞,同程,艺龙,马蜂窝,贝壳,自如,链家,我爱我家,相寓,多点,金山,小米,猎豹,新浪,微博,阿里,淘宝,淘麦郎,天猫,盒马,口碑,优视,夸克,UC,蚂蚁,高德,LAZADA,来赞达,飞猪,菜鸟,哈啰,钉钉,乌鸫,饿了么,美团,三快,猫眼,快手,映客,小红书,行吟,奇虎,360,三六零,鸿盈,奇富,奇元,亚信,启明星辰,奇安信,深信服,长亭,绿盟,天融信,商汤,SenseTime,大华,海康威视,hikvision,汽车之家,车好多,瓜子,易车,昆仑万维,昆仑天工,闲徕,趣加,FunPlus,完美,马上消费,轻松,水滴,白龙马,58,车欢欢,五八,红布林,致美,快狗,天鹅到家,转转,美餐,知乎,智者四海,易点云,搜狐,用友,畅捷通,猿辅导,小猿,猿力,好未来,学而思,希望学,新东方,东方甄选,东方优选,作业帮,高途,跟谁学,学科网,天学网,一起教育,一起作业,美术宝,火花思维,粉笔,51talk,爱学习,高思,老虎国际,一心向上,向上一意,联想,拉勾,乐视,欢聚,竞技世界,拼多多,寻梦,从鲸,TEMU,得物,有赞,Moka,希瑞亚斯,北森,OPPO,欧珀,vivo,维沃,小天才,步步高,读书郎,货拉拉,陌陌,探探,Shopee,虾皮,首汽租车,GoFun,神州租车,天眼查,旷视,小冰,美图,智谱华章,MiniMax,石头科技,迅雷,TP,锐捷,Tenda,腾达,斐讯,希音,SHEIN,稀宇,深言,百川智能,与爱为舞,牵手,Grab,爱回收,洋钱罐,瓴岳,得到,思维造物,地平线,咪咕,翼支付,电信,天翼,联通,蓝湖,墨刀,海尔,美的,米哈游,传音,同花顺,国美,TCL`
@@ -1696,7 +1652,7 @@ function handleExpectJobFilterTemplateClicked(item) {
const strategyOptionWhenCurrentJobNotMatch = [
{
name: '在Boss直聘上标记不合适推荐这确保Boss直聘推荐新职位来置换不合适职位)',
name: '在BOSS直聘上标记不合适推荐这确保BOSS直聘推荐新职位来置换不合适职位)',
value: MarkAsNotSuitOp.MARK_AS_NOT_SUIT_ON_BOSS
},
{

View File

@@ -214,7 +214,7 @@ function handleViewJobSnapshotButtonClick(record: VMarkAsNotSuitLog) {
}
const markReasonTopicMap = {
[MarkAsNotSuitReason.BOSS_INACTIVE]: 'Boss不活跃',
[MarkAsNotSuitReason.BOSS_INACTIVE]: 'BOSS不活跃',
[MarkAsNotSuitReason.USER_MANUAL_OPERATION_WITH_UNKNOWN_REASON]: '手动标记不合适',
[MarkAsNotSuitReason.JOB_NOT_SUIT]: '职位不合适',
[MarkAsNotSuitReason.JOB_CITY_NOT_SUIT]: '工作地不合适',
@@ -233,8 +233,8 @@ function formatMarkReason(row: VMarkAsNotSuitLog) {
}
})()
return [
extInfo?.bossActiveTimeDesc && `Boss活跃情况:${extInfo.bossActiveTimeDesc}`,
extInfo?.chosenReasonInUi?.text && `Boss选项内容:${extInfo.chosenReasonInUi.text}`
extInfo?.bossActiveTimeDesc && `BOSS活跃情况:${extInfo.bossActiveTimeDesc}`,
extInfo?.chosenReasonInUi?.text && `BOSS选项内容:${extInfo.chosenReasonInUi.text}`
]
.filter(Boolean)
.join('\n')
@@ -247,7 +247,7 @@ function formatMarkReason(row: VMarkAsNotSuitLog) {
return null
}
})()
return [extInfo?.chosenReasonInUi?.text && `Boss选项内容:${extInfo.chosenReasonInUi.text}`]
return [extInfo?.chosenReasonInUi?.text && `BOSS选项内容:${extInfo.chosenReasonInUi.text}`]
.filter(Boolean)
.join('\n')
}
@@ -260,7 +260,7 @@ function formatMarkReason(row: VMarkAsNotSuitLog) {
return null
}
})()
return [extInfo?.chosenReasonInUi?.text && `Boss选项内容:${extInfo.chosenReasonInUi.text}`]
return [extInfo?.chosenReasonInUi?.text && `BOSS选项内容:${extInfo.chosenReasonInUi.text}`]
.filter(Boolean)
.join('\n')
}
@@ -274,7 +274,7 @@ function formatMarkReason(row: VMarkAsNotSuitLog) {
})()
return [
extInfo?.salaryDesc && `薪资:${extInfo.salaryDesc}`,
extInfo?.chosenReasonInUi?.text && `Boss选项内容:${extInfo.chosenReasonInUi.text}`
extInfo?.chosenReasonInUi?.text && `BOSS选项内容:${extInfo.chosenReasonInUi.text}`
]
.filter(Boolean)
.join('\n')

View File

@@ -7,27 +7,14 @@
:model="formContent.autoReminder"
label-position="top"
>
<div flex>
<el-form-item label="BOSS直聘 Cookie">
<el-button size="small" type="primary" @click="handleClickLaunchLogin"
>编辑Cookie</el-button
>
</el-form-item>
<div w1px class="bg-#dee1e8" ml16px mr16px />
<el-form-item label="浏览器">
<el-button size="small" type="primary" @click="handleClickBrowserSetting"
>编辑浏览器设置</el-button
>
</el-form-item>
</div>
<el-form-item>
<div>
<el-checkbox v-if="!expectJobTypeRegExpStr?.trim()" :model-value="false" disabled>
发送提醒消息前先按照Boss炸弹-职位类型正则校验正在与Boss沟通的岗位是否满足期望校验通过后再提醒
发送提醒消息前先按照自动开聊-职位类型正则校验正在与BOSS沟通的岗位是否满足期望校验通过后再提醒
</el-checkbox>
<template v-else>
<el-checkbox v-model="formContent.autoReminder.onlyRemindBossWithExpectJobType">
发送提醒消息前先按照Boss炸弹-职位类型正则校验正在与Boss沟通的岗位是否满足期望校验通过后再提醒
发送提醒消息前先按照自动开聊-职位类型正则校验正在与BOSS沟通的岗位是否满足期望校验通过后再提醒
</el-checkbox>
<div ml1.5em color-gray>
<div>当前职位类型正则{{ expectJobTypeRegExpStr?.trim() }}</div>
@@ -44,7 +31,7 @@
</template>
</div>
</el-form-item>
<el-form-item class="mb0" label="跟进话术 - 当发现已读不回的Boss将要向Boss发出:">
<el-form-item class="mb0" label="跟进话术 - 当发现已读不回的BOSS将要向BOSS发出:">
<el-radio-group v-model="formContent.autoReminder.rechatContentSource">
<div>
<el-tooltip
@@ -74,32 +61,6 @@
RECHAT_CONTENT_SOURCE.GEMINI_WITH_CHAT_CONTEXT
"
>
<el-form-item class="mb4px">
<div>
<el-button size="small" type="primary" @click="handleClickConfigLlm">
配置大语言模型
</el-button>
<div class="font-size-12px color-#666">
支持
<span
class="pl6px pr6px pt4px pb2px color-white border-rd-full font-size-0.8em"
style="background-color: #3c4efd"
>DeepSeek-V3</span
>
<span
class="ml4px pl6px pr6px pt4px pb2px color-white border-rd-full font-size-0.8em"
style="background-color: #000000"
>GPT-4o mini</span
>
<span
class="ml4px pl6px pr6px pt4px pb2px color-white border-rd-full font-size-0.8em"
style="background-color: #462ac4"
>Qwen2.5</span
>
模型;支持多个“服务商-模型”组合按权重搭配使用
</div>
</div>
</el-form-item>
<el-form-item class="mb4px">
<div>
<el-button size="small" type="primary" @click="handleClickEditResume">
@@ -151,7 +112,7 @@
</el-form-item>
<el-form-item>
<el-button size="small" type="primary" @click="handleTestEffectClicked"
>使用当前配置模拟已读不回复聊过程</el-button
>使用当前配置模拟已读不回自动复聊过程</el-button
>
</el-form-item>
<el-form-item prop="recentMessageQuantityForLlm">
@@ -181,7 +142,7 @@
:precision="1"
:step="0.5"
@blur="handleThrottleIntervalMinutesBlur"
/>&nbsp;分钟内不多次跟进同一Boss
/>&nbsp;分钟内不多次跟进同一BOSS
</el-form-item>
<el-form-item label="跟进时限(天)" prop="rechatLimitDay" mb-0>
<div>
@@ -213,7 +174,7 @@
请向你不想继续提醒的Boss发送任意消息发送后立即撤回的这条消息即可。
<br />
<br />
对于PC端Boss直聘,鼠标移动到要撤回的消息,点按鼠标右键调出菜单,再鼠标左键点击菜单中的“撤回”。如图所示:
对于PC端BOSS直聘,鼠标移动到要撤回的消息,点按鼠标右键调出菜单,再鼠标左键点击菜单中的“撤回”。如图所示:
<br />
<img block w-full src="./resources/withdraw-message-guide.png" />
</li>
@@ -221,7 +182,7 @@
</template>
<el-button type="text" font-size-12px
><span><QuestionFilled w-1em h-1em mr2px /></span
>我不想持续提醒某个Boss了,如何处理?</el-button
>我不想持续提醒某个BOSS了,如何处理?</el-button
>
</el-tooltip>
</el-form-item>
@@ -562,31 +523,6 @@ const restoreDefaultTemplate = async () => {
})
}
const handleClickLaunchLogin = async () => {
gtagRenderer('launch_login_clicked')
try {
await electron.ipcRenderer.invoke('login-with-cookie-assistant')
ElMessage({
type: 'success',
message: 'Cookie 保存成功'
})
} catch {
//
}
}
const handleClickBrowserSetting = async () => {
gtagRenderer('browser_setting_clicked')
try {
await electron.ipcRenderer.invoke('config-with-browser-assistant')
ElMessage({
type: 'success',
message: '浏览器设置保存成功'
})
} catch {
//
}
}
const currentStamp = ref(new Date())
let timer = 0
function updateCurrentStamp() {
@@ -604,15 +540,6 @@ const rechatLimitDateString = computed(() => {
).format('YYYY-MM-DD HH:mm:ss')
})
const handleClickConfigLlm = async () => {
gtagRenderer('config_llm_clicked')
try {
await electron.ipcRenderer.invoke('llm-config')
} catch (err) {
console.log(err)
}
}
const handleClickEditResume = async () => {
gtagRenderer('edit_resume_clicked')
try {
@@ -634,7 +561,7 @@ const rechatLlmFallbackOptions = [
value: RECHAT_LLM_FALLBACK.SEND_LOOK_FORWARD_EMOTION
},
{
name: '退出已读不回提醒器',
name: '退出已读不回自动复聊',
value: RECHAT_LLM_FALLBACK.EXIT_REMINDER_PROGRAM
}
]

View File

@@ -1,100 +1,155 @@
<template>
<div class="flex h100vh">
<div class="flex flex-col min-w200px w200px pt30px pl30px aside-nav of-hidden">
<div class="nav-list flex-1 of-auto">
<div class="nav-list flex-1 of-auto pl20px ml--20px">
<RouterLink v-show="false" to="./TaskManager">任务管理</RouterLink>
<RouterLink to="./GeekAutoStartChatWithBoss">
Boss炸弹
<el-tooltip
placement="right"
:enterable="false"
@show="gtagRenderer('tooltip_show_for_nav_boss_b_entry')"
>
<template #content>
<div w-480px>
<div>扩列神器按照你所设置的求职偏好自动开聊推荐职位列表中的匹配的Boss</div>
<br />
<div>匹配步骤</div>
<ol m0 pl2em>
<li>
按照公司名称查找职位查找到目标职位后自动点击这个职位右侧将会展示职位详情
</li>
<li>
检查Boss活跃度
<ul pl2em>
<div class="group-item">
<div class="group-title">BOSS直聘</div>
<div flex flex-col class="link-list">
<RouterLink to="./GeekAutoStartChatWithBoss">
自动开聊
<el-tooltip
placement="right"
:enterable="false"
@show="gtagRenderer('tooltip_show_for_nav_boss_b_entry')"
>
<template #content>
<div w-480px>
<div>扩列神器按照你所设置的求职偏好自动开聊推荐职位列表中的匹配的BOSS</div>
<br />
<div>匹配步骤</div>
<ol m0 pl2em>
<li>
如果Boss活跃度为本月活跃或更往前的时间则会把职位标记为不合适一段时间内你将不会在Boss上看到这个职位且将会推荐新职位置换这个职位
按照公司名称查找职位查找到目标职位后自动点击这个职位右侧将会展示职位详情
</li>
<li>
检查BOSS活跃度
<ul pl2em>
<li>
如果BOSS活跃度为本月活跃或更往前的时间则会把职位标记为不合适一段时间内你将不会在BOSS上看到这个职位且将会推荐新职位置换这个职位
</li>
</ul>
</li>
<li>
对职位名称职位类型职位描述进行匹配
<ul pl2em>
<li>如果匹配则自动点击开聊按钮</li>
<li>
不匹配则标记这个职位为不合适一段时间内你将不会在BOSS上看到这个职位且将会推荐新职位置换这个职位
</li>
</ul>
</li>
</ol>
<br />
<div>异常情况</div>
<ol m0 pl2em>
<li>
当前页面筛选条件下如果没有更多职位则自动切换备选筛选条件以获取更多新职位
</li>
<li>
如当天开聊次数用完本程序会暂停运行60分钟之后尝试继续重新运行如重新运行时间已在第二天则将会继续开聊
</li>
</ol>
</div>
</template>
<QuestionFilled w-1em h-1em mr10px />
</el-tooltip>
</RouterLink>
<RouterLink to="./ReadNoReplyReminder">
已读不回自动复聊
<el-tooltip
placement="right"
:enterable="false"
@show="gtagRenderer('tooltip_show_for_rnrr_entry')"
>
<template #content>
<div w-480px>
<div>
BOSS不明原因已读不回简历就是投不出去<br />
已读不回自动复聊提醒一下已读不回的 BOSS助力把握每次机会
</div>
<br />
<div>匹配逻辑</div>
<div>在聊天列表中查找对你消息已读不回的BOSS再发一条消息多次复聊同时</div>
<ul m0 pl2em>
<li>如果设置了跟进时限那么在这个时间之前活跃的聊天将不会被检查</li>
<li>
如果设置了跟进间隔且再次检查时发现BOSS已读不回且距离上次提醒时间间隔小于这个时间那么聊天将暂时不会跟进直到下次检查时距离上次提醒时间间隔大于这个时间
</li>
</ul>
</li>
<li>
对职位名称职位类型职位描述进行匹配
<ul pl2em>
<li>如果匹配则自动点击开聊按钮</li>
<li>
不匹配则标记这个职位为不合适一段时间内你将不会在Boss上看到这个职位且将会推荐新职位置换这个职位
</li>
<br />
<div>发送内容</div>
<ul m0 pl2em>
<li>[盼回复]表情</li>
<li>由大语言模型根据简历及当前聊天上下文生成的内容</li>
</ul>
</li>
</ol>
<br />
<div>异常情况</div>
<ol m0 pl2em>
<li>
当前页面筛选条件下如果没有更多职位则自动切换备选筛选条件以获取更多新职位
</li>
<li>
如当天开聊次数用完本程序会暂停运行60分钟之后尝试继续重新运行如重新运行时间已在第二天则将会继续开聊
</li>
</ol>
</div>
</template>
<QuestionFilled w-1em h-1em mr10px />
</el-tooltip>
</RouterLink>
<a href="javascript:void(0)" @click="handleClickLaunchBossLogin">
编辑登录凭据<TopRight w-1em h-1em mr10px />
</a>
<a href="javascript:void(0)" @click="handleLaunchBossSite">
手动逛<TopRight w-1em h-1em mr10px />
</a>
</div>
</div>
<hr class="group-divider" />
<div class="group-item">
<div class="group-title">全局设置</div>
<div flex flex-col class="link-list">
<a href="javascript:void(0)" @click="handleClickBrowserSetting">
编辑浏览器偏好<TopRight w-1em h-1em mr10px />
</a>
<a href="javascript:void(0)" @click="handleClickConfigLlm">
配置大语言模型
<div>
<el-tooltip
placement="right"
:enterable="false"
@show="gtagRenderer('tooltip_show_for_rnrr_entry')"
>
<template #content>
<div class="font-size-12px">
支持
<span
class="pl6px pr6px pt4px pb2px color-white border-rd-full font-size-0.8em"
style="background-color: #3c4efd"
>DeepSeek-V3</span
>
<span
class="ml4px pl6px pr6px pt4px pb2px color-black border-rd-full font-size-0.8em"
style="background-color: #fff"
>GPT-4o mini</span
>
<span
class="ml4px pl6px pr6px pt4px pb2px color-white border-rd-full font-size-0.8em"
style="background-color: #462ac4"
>Qwen2.5</span
>
模型<br />支持多个服务商-模型组合按权重搭配使用
</div>
</template>
<QuestionFilled w-1em h-1em mr10px />
</el-tooltip>
<TopRight w-1em h-1em mr10px />
</div>
</template>
<QuestionFilled w-1em h-1em mr10px />
</el-tooltip>
</RouterLink>
<RouterLink to="./ReadNoReplyReminder">
已读不回提醒器
<el-tooltip
placement="right"
:enterable="false"
@show="gtagRenderer('tooltip_show_for_rnrr_entry')"
>
<template #content>
<div w-480px>
<div>
Boss不明原因已读不回简历就是投不出去<br />
已读不回提醒器有事没事提醒一下已读不回的 Ta助力把握每次机会
</div>
<br />
<div>匹配逻辑</div>
<div>在聊天列表中查找对你消息已读不回的Boss再发一条消息多次复聊同时</div>
<ul m0 pl2em>
<li>如果设置了跟进时限那么在这个时间之前活跃的聊天将不会被检查</li>
<li>
如果设置了跟进间隔且再次检查时发现Boss已读不回且距离上次提醒时间间隔小于这个时间那么聊天将暂时不会跟进直到下次检查时距离上次提醒时间间隔大于这个时间
</li>
</ul>
<br />
<div>发送内容</div>
<ul m0 pl2em>
<li>[盼回复]表情</li>
<li>由大语言模型根据简历及当前聊天上下文生成的内容</li>
</ul>
</div>
</template>
<QuestionFilled w-1em h-1em mr10px />
</el-tooltip>
</RouterLink>
<hr w180px />
<a href="javascript:void(0)" @click="handleLaunchBossSite">
手动逛Boss<TopRight w-1em h-1em mr10px />
</a>
<hr w180px />
<RouterLink to="./StartChatRecord">开聊记录</RouterLink>
<RouterLink to="./MarkAsNotSuitRecord">标记不合适记录</RouterLink>
<RouterLink to="./JobLibrary">职位库</RouterLink>
<RouterLink to="./BossLibrary">Boss库</RouterLink>
<RouterLink to="./CompanyLibrary">公司库</RouterLink>
</a>
</div>
</div>
<hr class="group-divider" />
<div class="group-item">
<div class="group-title">运行数据</div>
<div flex flex-col class="link-list">
<RouterLink to="./StartChatRecord">开聊记录</RouterLink>
<RouterLink to="./MarkAsNotSuitRecord">标记不合适记录</RouterLink>
<RouterLink to="./JobLibrary">职位库</RouterLink>
<RouterLink to="./BossLibrary">BOSS库</RouterLink>
<RouterLink to="./CompanyLibrary">公司库</RouterLink>
</div>
</div>
</div>
<div class="pt-16px pb-16px flex-0 font-size-12px">
<div v-if="updateStore.availableNewRelease" mb16px>
@@ -137,11 +192,13 @@
</div>
</div>
</div>
<RouterView v-slot="{ Component }" class="flex-1 of-hidden">
<KeepAlive>
<component :is="Component" />
</KeepAlive>
</RouterView>
<div class="router-view-wrap">
<RouterView v-slot="{ Component }" class="flex-1 of-hidden">
<KeepAlive>
<component :is="Component" />
</KeepAlive>
</RouterView>
</div>
</div>
</template>
@@ -152,6 +209,7 @@ import useBuildInfo from '@renderer/hooks/useBuildInfo'
import { debounce } from 'lodash'
import { gtagRenderer } from '@renderer/utils/gtag'
import { useUpdateStore, useTaskManagerStore } from '../../store/index'
import { ElMessage } from 'element-plus'
useRouter()
@@ -188,34 +246,82 @@ function handleViewNewReleaseClick() {
const taskManagerStore = useTaskManagerStore()
void taskManagerStore
const handleClickLaunchBossLogin = async () => {
gtagRenderer('launch_login_clicked')
try {
await electron.ipcRenderer.invoke('login-with-cookie-assistant')
ElMessage({
type: 'success',
message: '登录凭据保存成功'
})
} catch {
//
}
}
const handleClickBrowserSetting = async () => {
gtagRenderer('browser_setting_clicked')
try {
await electron.ipcRenderer.invoke('config-with-browser-assistant')
ElMessage({
type: 'success',
message: '浏览器偏好保存成功'
})
} catch {
//
}
}
const handleClickConfigLlm = async () => {
gtagRenderer('config_llm_clicked')
try {
await electron.ipcRenderer.invoke('llm-config')
} catch (err) {
console.log(err)
}
}
</script>
<style lang="scss" scoped>
.aside-nav {
background-image: linear-gradient(45deg, #eaf4f1, #dcf6f2);
.nav-list {
> a {
display: flex;
align-items: center;
justify-content: space-between;
height: 2.5em;
box-sizing: border-box;
padding-left: 2em;
&.router-link-active {
background-color: #fff;
font-weight: 700;
color: #2faa9e;
border-radius: 9999px 0 0 9999px;
}
}
> hr {
hr.group-divider {
width: 100%;
border: 0 solid;
height: 1px;
background-color: #b3c8c3;
margin-top: 0;
margin-bottom: 0;
margin-top: 4px;
margin-bottom: 4px;
margin-right: 0;
}
.group-item {
.group-title {
color: #849492;
font-size: 12px;
padding: 0.25em 0;
}
.link-list {
a {
display: flex;
align-items: center;
justify-content: space-between;
height: 2em;
box-sizing: border-box;
padding-left: 1em;
font-size: 14px;
&.router-link-active {
background-color: #fff;
font-weight: 700;
color: #2faa9e;
border-radius: 9999px 0 0 9999px;
position: relative;
box-shadow: 0px 0px 10px rgba(50, 114, 108, 0.187);
}
}
}
}
}
.feedback-button-area,
.update-button-area {
@@ -226,4 +332,10 @@ void taskManagerStore
}
}
}
.router-view-wrap {
display: flex;
flex: 1;
height: 100%;
box-shadow: -4px 1px 20px rgb(50 114 108 / 29%);
}
</style>

View File

@@ -14,7 +14,7 @@ const routes: Array<RouteRecordRaw> = [
path: '/cookieAssistant',
component: () => import('@renderer/page/CookieAssistant/index.vue'),
meta: {
title: 'Boss 登录助手'
title: 'BOSS登录助手'
}
},
{
@@ -56,7 +56,7 @@ const routes: Array<RouteRecordRaw> = [
path: '/readNoReplyReminderLlmMock',
component: () => import('@renderer/page/ReadNoReplyReminderLlmMock/index.vue'),
meta: {
title: '已读不回提醒器 大语言模型测试'
title: '已读不回自动复聊 大语言模型测试'
}
},
{
@@ -75,14 +75,14 @@ const routes: Array<RouteRecordRaw> = [
path: 'GeekAutoStartChatWithBoss',
component: () => import('@renderer/page/MainLayout/GeekAutoStartChatWithBoss/index.vue'),
meta: {
title: 'BOSS炸弹'
title: '自动开聊'
}
},
{
path: 'ReadNoReplyReminder',
component: () => import('@renderer/page/MainLayout/ReadNoReplyReminder.vue'),
meta: {
title: '已读不回提醒器'
title: '已读不回自动复聊'
}
},
{
@@ -110,7 +110,7 @@ const routes: Array<RouteRecordRaw> = [
path: 'BossLibrary',
component: () => import('@renderer/page/MainLayout/BossLibrary.vue'),
meta: {
title: 'Boss库'
title: 'BOSS库'
}
},
{
@@ -130,14 +130,14 @@ const routes: Array<RouteRecordRaw> = [
path: 'prepareRun',
component: () => import('@renderer/page/GeekAutoStartChatWithBoss/PrepareRun.vue'),
meta: {
title: 'BOSS炸弹 正在预热'
title: '自动开聊 正在预热'
}
},
{
path: 'runningStatus',
component: () => import('@renderer/page/GeekAutoStartChatWithBoss/RunningStatus.vue'),
meta: {
title: 'BOSS炸弹 正在为你开聊BOSS'
title: '自动开聊 正在为你开聊BOSS'
}
},
{
@@ -147,7 +147,7 @@ const routes: Array<RouteRecordRaw> = [
'@renderer/page/GeekAutoStartChatWithBoss/RunningStatusForReadNoReplyReminder.vue'
),
meta: {
title: '已读不回提醒器 正在为你开聊BOSS'
title: '已读不回自动复聊 正在为你开聊BOSS'
}
}
]