diff --git a/.env b/.env new file mode 100644 index 0000000..cd56da8 --- /dev/null +++ b/.env @@ -0,0 +1,4 @@ +PY_HOSTNAME=localhost +PY_PORT=9999 +VAR=1234 +BKEXE_PATH=./backend/__main__.exe \ No newline at end of file diff --git a/.gitignore b/.gitignore index b0e5a1b..4afc92d 100644 --- a/.gitignore +++ b/.gitignore @@ -28,7 +28,4 @@ npm-debug.log.* *.sass.d.ts *.scss.d.ts assets/backend/* -src/renderer/services/analytics/index.ts - -.env -.vscode +src/renderer/services/analytics/* \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..d916524 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["dbaeumer.vscode-eslint", "EditorConfig.EditorConfig"] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..7494aab --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,30 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Electron: Main", + "type": "node", + "request": "launch", + "protocol": "inspector", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "start"], + "env": { + "MAIN_ARGS": "--inspect=5858 --remote-debugging-port=9223" + } + }, + { + "name": "Electron: Renderer", + "type": "chrome", + "request": "attach", + "port": 9223, + "webRoot": "${workspaceFolder}", + "timeout": 15000 + } + ], + "compounds": [ + { + "name": "Electron: All", + "configurations": ["Electron: Main", "Electron: Renderer"] + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..4a58cba --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,30 @@ +{ + "files.associations": { + ".eslintrc": "jsonc", + ".prettierrc": "jsonc", + ".eslintignore": "ignore" + }, + + "eslint.validate": [ + "javascript", + "javascriptreact", + "html", + "typescriptreact" + ], + + "javascript.validate.enable": false, + "javascript.format.enable": false, + "typescript.format.enable": false, + + "search.exclude": { + ".git": true, + ".eslintcache": true, + ".erb/dll": true, + "release/{build,app/dist}": true, + "node_modules": true, + "npm-debug.log.*": true, + "test/**/__snapshots__": true, + "package-lock.json": true, + "*.{css,sass,scss}.d.ts": true + } +} diff --git a/CHANGELOG.md b/CHANGELOG.md index 13775b9..5310ab5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,12 +1,533 @@ -# 1.0.1 -* 修复旧版本 chrome 无法下载驱动的 BUG -* 修复应用开启多个进程的 BUG +# 2.1.0 +- Migrate to `css-minifier-webpack-plugin` + +# 2.0.1 + +## Fixes + +- Fix broken css linking in production build + +# 2.0.0 + +## Breaking Changes + +- drop redux +- remove counter example app +- simplify directory structure +- move `dll` dir to `.erb` dir +- fix icon/font import paths +- migrate to `react-refresh` from `react-hot-loader` +- migrate to webpack@5 +- migrate to electron@11 +- remove e2e tests and testcafe integration +- rename `app` dir to more conventional `src` dir +- rename `resources` dir to `assets` +- simplify npm scripts +- drop stylelint +- simplify styling of boilerplate app +- remove `START_HOT` env variable +- notarize support +- landing page boilerplate +- docs updates +- restore removed debugging support + +# 1.4.0 + +- Migrate to `eslint-config-erb@2` +- Rename `dev` npm script to `start` +- GitHub Actions: only publish GitHub releases when on master branch + +# 1.3.1 + +- Fix sass building bug ([#2540](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2540)) +- Fix CI bug related to E2E tests and network timeouts +- Move automated dependency PRs to `next` ([#2554](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2554)) +- Bump dependencies to patch semver + +# 1.3.0 + +- Fixes E2E tests ([#2516](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2516)) +- Fixes preload entrypoint ([#2503](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2503)) +- Downgrade to `electron@8` +- Bump dependencies to latest semver + +# 1.2.0 + +- Migrate to redux toolkit +- Lazy load routes with react suspense +- Drop support for azure-pipelines and use only github actions +- Bump all deps to latest semver +- Remove `test-e2e` script from tests (blocked on release of https://github.com/DevExpress/testcafe-browser-provider-electron/pull/65) +- Swap `typed-css-modules-webpack-plugin` for `typings-for-css-modules-loader` +- Use latest version of `eslint-config-erb` +- Remove unnecessary file extensions from ts exclude +- Add experimental support for vscode debugging +- Revert https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2365 as default for users, provide as opt in option + +# 1.1.0 + +- Fix #2402 +- Simplify configs (https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2406) # 1.0.0 -- [x] 多平台支持:当前支持哔哩哔哩、抖音企业号、抖音、抖店、微博聊天、小红书专业号运营、小红书、知乎等平台,未来将不断扩展支持更多社交媒体平台。 -- [x] 预设回复内容:允许用户设置自定义回复,以应对常见问题,提高回复效率。 -- [x] 接入ChatGPT接口,根据客户的咨询内容智能生成回复,适用于处理复杂或者个性化的客户咨询。 -- [x] 发送图片和二进制文件:支持发送图片等二进制文件,满足多样化的客户服务需求。 -- [x] 知识库: 通过上传知识库文件自定义专属机器人,可作为数字分身、智能客服、私域助手使用,基于 [懒人百宝箱](https://chat.lazaytools.top/) 实现 -- [x] 各个平台独立的插件系统,支持插件访问操作系统和互联网等外部资源,支持基于自有知识库定制企业 AI 应用。 \ No newline at end of file + +- Migrate to TypeScript from Flow ([#2363](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2363)) +- Use browserslist for `@babel/preset-env` targets ([#2368](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2368)) +- Use preload script, disable `nodeIntegration` in renderer process for [improved security](https://www.electronjs.org/docs/tutorial/security#2-do-not-enable-nodejs-integration-for-remote-content) ([#2365](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2365)) +- Add support for azure pipelines ([#2369](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2369)) +- Disable sourcemaps in production + +# 0.18.1 (2019.12.12) + +- Fix HMR env bug ([#2343](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2343)) +- Bump all deps to latest semver +- Bump to `electron@7` + +# 0.18.0 (2019.11.19) + +- Bump electron to `electron@6` (`electron@7` introduces breaking changes to testcafe end to end tests) +- Revert back to [two `package.json` structure](https://www.electron.build/tutorials/two-package-structure) +- Bump all deps to latest semver + +# 0.17.1 (2018.11.20) + +- Fix `yarn test-e2e` and testcafe for single package.json structure +- Fixes incorrect path in `yarn start` script +- Bumped deps +- Bump g++ in travis +- Change clone arguments to clone only master +- Change babel config to target current electron version + +For full change list, see https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2021 + +# 0.17.0 (2018.10.30) + +- upgraded to `babel@7` (thanks to @vikr01 🎉🎉🎉) +- migrated from [two `package.json` structure](https://www.electron.build/tutorials/two-package-structure) (thanks to @HyperSprite!) +- initial auto update support (experimental) +- migrate from greenkeeper to [renovate](https://renovatebot.com) +- added issue template +- use `babel-preset-env` to target current electron version +- add [opencollective](https://opencollective.com/electron-react-boilerplate-594) banner message display in postinstall script (help support ERB 🙏) +- fix failing ci issues + +# 0.16.0 (2018.10.3) + +- removed unused dependencies +- migrate from `react-redux-router` to `connect-react-router` +- move webpack configs to `./webpack` dir +- use `g++` on travis when testing linux +- migrate from `spectron` to `testcafe` for e2e tests +- add linting support for config styles +- changed stylelint config +- temporarily disabled flow in appveyor to make ci pass +- added necessary infra to publish releases from ci + +# 0.15.0 (2018.8.25) + +- Performance: cache webpack uglify results +- Feature: add start minimized feature +- Feature: lint and fix styles with prettier and stylelint +- Feature: add greenkeeper support + +# 0.14.0 (2018.5.24) + +- Improved CI timings +- Migrated README commands to yarn from npm +- Improved vscode config +- Updated all dependencies to latest semver +- Fix `electron-rebuild` script bug +- Migrated to `mini-css-extract-plugin` from `extract-text-plugin` +- Added `optimize-css-assets-webpack-plugin` +- Run `prettier` on json, css, scss, and more filetypes + +# 0.13.3 (2018.5.24) + +- Add git precommit hook, when git commit will use `prettier` to format git add code +- Add format code function in `lint-fix` npm script which can use `prettier` to format project js code + +# 0.13.2 (2018.1.31) + +- Hot Module Reload (HMR) fixes +- Bumped all dependencies to latest semver +- Prevent error propagation of `CheckNativeDeps` script + +# 0.13.1 (2018.1.13) + +- Hot Module Reload (HMR) fixes +- Bumped all dependencies to latest semver +- Fixed electron-rebuild script +- Fixed tests scripts to run on all platforms +- Skip redux logs in console in test ENV + +# 0.13.0 (2018.1.6) + +#### Additions + +- Add native dependencies check on postinstall +- Updated all dependencies to latest semver + +# 0.12.0 (2017.7.8) + +#### Misc + +- Removed `babel-polyfill` +- Renamed and alphabetized npm scripts + +#### Breaking + +- Changed node dev `__dirname` and `__filename` to node built in fn's (https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/1035) +- Renamed `src/bundle.js` to `src/renderer.prod.js` for consistency +- Renamed `dll/vendor.js` to `dll/renderer.dev.dll.js` for consistency + +#### Additions + +- Enable node_modules cache on CI + +# 0.11.2 (2017.5.1) + +Yay! Another patch release. This release mostly includes refactorings and router bug fixes. Huge thanks to @anthonyraymond! + +⚠️ Windows electron builds are failing because of [this issue](https://github.com/electron/electron/issues/9321). This is not an issue with the boilerplate ⚠️ + +#### Breaking + +- **Renamed `./src/main.development.js` => `./src/main.{dev,prod}.js`:** [#963](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/963) + +#### Fixes + +- **Fixed reloading when not on `/` path:** [#958](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/958) [#949](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/949) + +#### Additions + +- **Added support for stylefmt:** [#960](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/960) + +# 0.11.1 (2017.4.23) + +You can now debug the production build with devtools like so: + +``` +DEBUG_PROD=true npm run package +``` + +🎉🎉🎉 + +#### Additions + +- **Added support for debugging production build:** [#fab245a](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/941/commits/fab245a077d02a09630f74270806c0c534a4ff95) + +#### Bug Fixes + +- **Fixed bug related to importing native dependencies:** [#933](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/933) + +#### Improvements + +- **Updated all deps to latest semver** + +# 0.11.0 (2017.4.19) + +Here's the most notable changes since `v0.10.0`. Its been about a year since a release has been pushed. Expect a new release to be published every 3-4 weeks. + +#### Breaking Changes + +- **Dropped support for node < 6** +- **Refactored webpack config files** +- **Migrate to two-package.json project structure** +- **Updated all devDeps to latest semver** +- **Migrated to Jest:** [#768](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/768) +- **Migrated to `react-router@4`** +- **Migrated to `electron-builder@4`** +- **Migrated to `webpack@2`** +- **Migrated to `react-hot-loader@3`** +- **Changed default live reload server PORT to `1212` from `3000`** + +#### Additions + +- **Added support for Yarn:** [#451](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/451) +- **Added support for Flow:** [#425](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/425) +- **Added support for stylelint:** [#911](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/911) +- **Added support for electron-builder:** [#876](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/876) +- **Added optional support for SASS:** [#880](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/880) +- **Added support for eslint-plugin-flowtype:** [#911](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/911) +- **Added support for appveyor:** [#280](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/280) +- **Added support for webpack dlls:** [#860](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/860) +- **Route based code splitting:** [#884](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/884) +- **Added support for Webpack Bundle Analyzer:** [#922](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/922) + +#### Improvements + +- **Parallelize renderer and main build processes when running `npm run build`** +- **Dynamically generate electron app menu** +- **Improved vscode integration:** [#856](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/856) + +#### Bug Fixes + +- **Fixed hot module replacement race condition bug:** [#917](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/917) [#920](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/920) + +# 0.10.0 (2016.4.18) + +#### Improvements + +- **Use Babel in main process with Webpack build:** [#201](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/201) +- **Change targets to built-in support by webpack:** [#197](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/197) +- **use es2015 syntax for webpack configs:** [#195](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/195) +- **Open application when webcontent is loaded:** [#192](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/192) +- **Upgraded dependencies** + +#### Bug fixed + +- **Fix `npm list electron-prebuilt` in package.js:** [#188](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/188) + +# 0.9.0 (2016.3.23) + +#### Improvements + +- **Added [redux-logger](https://github.com/fcomb/redux-logger)** +- **Upgraded [react-router-redux](https://github.com/reactjs/react-router-redux) to v4** +- **Upgraded dependencies** +- **Added `npm run dev` command:** [#162](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/162) +- **electron to v0.37.2** + +#### Breaking Changes + +- **css module as default:** [#154](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/154). +- **set default NODE_ENV to production:** [#140](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/140) + +# 0.8.0 (2016.2.17) + +#### Bug fixed + +- **Fix lint errors** +- **Fix Webpack publicPath for production builds**: [#119](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/119). +- **package script now chooses correct OS icon extension** + +#### Improvements + +- **babel 6** +- **Upgrade Dependencies** +- **Enable CSS source maps** +- **Add json-loader**: [#128](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/128). +- **react-router 2.0 and react-router-redux 3.0** + +# 0.7.1 (2015.12.27) + +#### Bug fixed + +- **Fixed npm script on windows 10:** [#103](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/103). +- **history and react-router version bump**: [#109](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/109), [#110](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/110). + +#### Improvements + +- **electron 0.36** + +# 0.7.0 (2015.12.16) + +#### Bug fixed + +- **Fixed process.env.NODE_ENV variable in webpack:** [#74](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/74). +- **add missing object-assign**: [#76](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/76). +- **packaging in npm@3:** [#77](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/77). +- **compatibility in windows:** [#100](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/100). +- **disable chrome debugger in production env:** [#102](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/102). + +#### Improvements + +- **redux** +- **css-modules** +- **upgrade to react-router 1.x** +- **unit tests** +- **e2e tests** +- **travis-ci** +- **upgrade to electron 0.35.x** +- **use es2015** +- **check dev engine for node and npm** + +# 0.6.5 (2015.11.7) + +#### Improvements + +- **Bump style-loader to 0.13** +- **Bump css-loader to 0.22** + +# 0.6.4 (2015.10.27) + +#### Improvements + +- **Bump electron-debug to 0.3** + +# 0.6.3 (2015.10.26) + +#### Improvements + +- **Initialize ExtractTextPlugin once:** [#64](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/64). + +# 0.6.2 (2015.10.18) + +#### Bug fixed + +- **Babel plugins production env not be set properly:** [#57](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/57). + +# 0.6.1 (2015.10.17) + +#### Improvements + +- **Bump electron to v0.34.0** + +# 0.6.0 (2015.10.16) + +#### Breaking Changes + +- **From react-hot-loader to react-transform** + +# 0.5.2 (2015.10.15) + +#### Improvements + +- **Run tests with babel-register:** [#29](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/29). + +# 0.5.1 (2015.10.12) + +#### Bug fixed + +- **Fix #51:** use `path.join(__dirname` instead of `./`. + +# 0.5.0 (2015.10.11) + +#### Improvements + +- **Simplify webpack config** see [#50](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/50). + +#### Breaking Changes + +- **webpack configs** +- **port changed:** changed default port from 2992 to 3000. +- **npm scripts:** remove `start-dev` and `dev-server`. rename `hot-dev-server` to `hot-server`. + +# 0.4.3 (2015.9.22) + +#### Bug fixed + +- **Fix #45 zeromq crash:** bump version of `electron-prebuilt`. + +# 0.4.2 (2015.9.15) + +#### Bug fixed + +- **run start-hot breaks chrome refresh(CTRL+R) (#42)**: bump `electron-debug` to `0.2.1` + +# 0.4.1 (2015.9.11) + +#### Improvements + +- **use electron-prebuilt version for packaging (#33)** + +# 0.4.0 (2015.9.5) + +#### Improvements + +- **update dependencies** + +# 0.3.0 (2015.8.31) + +#### Improvements + +- **eslint-config-airbnb** + +# 0.2.10 (2015.8.27) + +#### Features + +- **custom placeholder icon** + +#### Improvements + +- **electron-renderer as target:** via [webpack-target-electron-renderer](https://github.com/chentsulin/webpack-target-electron-renderer) + +# 0.2.9 (2015.8.18) + +#### Bug fixed + +- **Fix hot-reload** + +# 0.2.8 (2015.8.13) + +#### Improvements + +- **bump electron-debug** +- **babelrc** +- **organize webpack scripts** + +# 0.2.7 (2015.7.9) + +#### Bug fixed + +- **defaultProps:** fix typos. + +# 0.2.6 (2015.7.3) + +#### Features + +- **menu** + +#### Bug fixed + +- **package.js:** include webpack build. + +# 0.2.5 (2015.7.1) + +#### Features + +- **NPM Script:** support multi-platform +- **package:** `--all` option + +# 0.2.4 (2015.6.9) + +#### Bug fixed + +- **Eslint:** typo, [#17](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/17) and improve `.eslintrc` + +# 0.2.3 (2015.6.3) + +#### Features + +- **Package Version:** use latest release electron version as default +- **Ignore Large peerDependencies** + +#### Bug fixed + +- **Npm Script:** typo, [#6](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/6) +- **Missing css:** [#7](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/7) + +# 0.2.2 (2015.6.2) + +#### Features + +- **electron-debug** + +#### Bug fixed + +- **Webpack:** add `.json` and `.node` to extensions for imitating node require. +- **Webpack:** set `node_modules` to externals for native module support. + +# 0.2.1 (2015.5.30) + +#### Bug fixed + +- **Webpack:** #1, change build target to `atom`. + +# 0.2.0 (2015.5.30) + +#### Features + +- **Ignore:** `test`, `tools`, `release` folder and devDependencies in `package.json`. +- **Support asar** +- **Support icon** + +# 0.1.0 (2015.5.27) + +#### Features + +- **Webpack:** babel, react-hot, ... +- **Flux:** actions, api, components, containers, stores.. +- **Package:** darwin (osx), linux and win32 (windows) platform. diff --git a/README.md b/README.md index 93ac85d..b22df15 100644 --- a/README.md +++ b/README.md @@ -1,106 +1,71 @@ -## 懒人客服简介 -本项目是基于大模型的智能对话客服工具,支持哔哩哔哩、抖音企业号、抖音、抖店、微博聊天、小红书专业号运营、小红书、知乎等平台接入,可选择 GPT3.5/GPT4.0/ [懒人百宝箱](https://chat.lazaytools.top/) (后续会支持更多平台),能处理文本、语音和图片,通过插件访问操作系统和互联网等外部资源,支持基于自有知识库定制企业 AI 应用。 - -注:本项目只是一个用于对接外部平台的客服工具,不提供任何平台的账号,需要自行准备。并且知识库功能也需要自行准备,该项目目前只支持的 OpenAI 的 API 接口(或代理)接入 - -## 主要功能 -- [x] 多平台支持:当前支持哔哩哔哩、抖音企业号、抖音、抖店、微博聊天、小红书专业号运营、小红书、知乎等平台,未来将不断扩展支持更多社交媒体平台。 -- [x] 预设回复内容:允许用户设置自定义回复,以应对常见问题,提高回复效率。 -- [x] 接入ChatGPT接口,根据客户的咨询内容智能生成回复,适用于处理复杂或者个性化的客户咨询。 -- [x] 发送图片和二进制文件:支持发送图片等二进制文件,满足多样化的客户服务需求。 -- [x] 知识库: 通过上传知识库文件自定义专属机器人,可作为数字分身、智能客服、私域助手使用,基于 [懒人百宝箱](https://chat.lazaytools.top/) 实现 -- [x] 各个平台独立的插件系统,支持插件访问操作系统和互联网等外部资源,支持基于自有知识库定制企业 AI 应用。 -## 演示视频 -[观看视频](https://www.bilibili.com/video/BV1qz421Q73S) +## 目录结构设计 +``` +my-app/ +├── node_modules/ +├── public/ +├── src/ +│ ├── components/ +│ │ ├── layout/ +│ │ │ ├── Navbar.js +│ │ │ ├── Sidebar.js +│ │ │ └── Footer.js +│ │ ├── ui/ +│ │ └── common/ +│ ├── pages/ +│ │ ├── HomePage.js +│ │ ├── SettingsPage.js +│ │ └── AboutPage.js +│ ├── utils/ (或者 helpers/) +│ ├── hooks/ +│ ├── assets/ +│ │ ├── images/ +│ │ └── styles/ +│ ├── constants/ +│ ├── context/ +│ ├── services/ (或者 api/) +│ └── App.js +├── .gitignore +├── package.json +└── README.md +``` -## 开源社区 -如果有问题需要反馈,或者对项目有什么特性希望支持的,可以添加小助手微信加入开源项目交流群: - -![微信扫码添加客服](docs/contact.png) - - +- `components/`: 存放可复用的组件,如按钮、输入框等。 + - `layout/`: 用于布局相关的组件,如导航栏、侧边栏、页脚等。 + - `ui/`: UI 组件,可能包括主题特定的组件。 + - `common/`: 其他通用组件。 +- `pages/`: 存放应用的页面组件,通常这些组件会对应不同的路由。 +- `utils/` 或 `helpers/`: 存放工具函数或者帮助函数。 +- `hooks/`: 存放自定义钩子。 +- `assets/`: 存放静态资源,如图片、CSS 文件等。 +- `constants/`: 存放常量定义。 +- `context/`: 存放 React 的 Context 文件,用于状态管理。 +- `services/` 或 `api/`: 存放与后端交互的服务或 API 调用。 -## 下载地址 +## webpack 配置说明 +在 Electron-React-Boilerplate 项目中,Webpack配置被细分以适应不同的用途和环境。这些配置包括基础配置、针对ESLint的配置、主进程和渲染进程的开发与生产配置,以及预加载(preload)脚本和动态链接库(DLL)的特定配置。为了使`.env`文件中的环境变量在你的应用中可用,主要关注点应是主进程和渲染进程的配置文件。下面是每个文件的简要说明,以及你可能需要修改的文件: -点击下载 +- **webpack.config.base.ts**: 基础配置,被其他所有配置文件共享。如果你想要全局应用一些配置(如解析规则、插件等),这是一个好地方。 +- **webpack.config.eslint.ts**: 专门为ESLint设置的Webpack配置。通常,不需要在这里添加`.env`文件支持。 +- **webpack.config.main.prod.ts**: 主进程的生产环境配置。如果你需要在生产环境的主进程中使用环境变量,应修改此文件。 +- **webpack.config.preload.dev.ts**: 开发环境的预加载脚本配置。这个配置用于预加载脚本,除非你特别需要在预加载脚本中使用环境变量,否则无需修改。 +- **webpack.config.renderer.dev.dll.ts**: 用于渲染进程开发环境的DLL配置。这主要用于性能优化,不是加载`.env`的目标。 +- **webpack.config.renderer.dev.ts**: 渲染进程的开发环境配置。如果你需要在开发环境的渲染进程中使用环境变量,应修改此文件。 +- **webpack.config.renderer.prod.ts**: 渲染进程的生产环境配置。如果你需要在生产环境的渲染进程中使用环境变量,应修改此文件。 +- **webpack.paths.ts**: 定义Webpack使用的各种路径。通常,不需要为了`.env`支持而修改此文件。 +### 如何确定修改哪个? +直接看 package.json 中的 scripts,找到对应的配置文件,然后修改即可。 -## 使用说明 -第一次启动时可能会有点慢,因为它需要先下载驱动文件和初始化回复数据库,所以请耐心等待。 - -### 1、设置 GPT 地址 - -启动程序后,点击设置按钮,设置好你的 OpenAPI Key 和 代理服务器地址,然后点击保存。 - -![alt text](docs/first_settings_1.png) - -![alt text](docs/first_settings_2.png) - - -### 2、首页操作说明 -首先可以看到首页这里的 “连接” 项,有两个勾选框,默认是暂停软件的,如果你想让软件开始工作,就把这个勾选框去掉。 - -![alt text](docs/home_settings_1.png) - -当第一次打开时,默认是没有任何的登录态的,所以会需要你手动暂停一下,然后登录后再,再取消勾选暂停,让它开始工作。 - -![alt text](docs/home_settings_2.png) - -自动回复开启后它就会读取你下面勾选的平台,自动打开该页面开始工作。注意上面部分的勾选框无法点击,是因为作者没有相关平台的账号,所以无法登录调试该平台的信息,如果你有相关平台的账号并且想要支持该平台的自动回复,可以联系上面的客服。 - -### 3、关键词的编写 -当上面的 “开启关键词匹配” 勾选后,会优先匹配这里设置的关键词,如果匹配到了关键词,就会回复关键词的回复内容,当没有匹配上关键词的问题,则会调用你提供的 ChatGPT API 去询问 GPT 回答用户问题。 - -![alt text](docs/reply_settings_1.png) - -点击 “新增关键词” 按钮可以自定义关键词和回复内容。 - -![alt text](docs/reply_settings_2.png) - -可以添加若干个用于匹配的关键词 - -关键词的编写规则是,如果只写 `你好`,那么只要用户输入的内容为 `你好` 时则会回复你设置的回复内容。如果想要模糊匹配可以使用 `*` 符号,例如 `你好*`,那么只要用户输入的内容以 `你好` 开头就会回复你设置的回复内容。 - -同理,如果你设置的关键词为 `*你好*`,那么只要用户输入的内容中包含 `你好` 就会回复你设置的回复内容。 - -比较特殊的,如果使用下面的 “开始关键词” 和 “结束关键词” 时,那么只要用户输入的内容以 “开始关键词” 开头,并且以 “结束关键词” 结尾,就能匹配上你设置的关键词。 - - -### 4、回复的编写 -一条关键词规则可以对应多条回复内容,当匹配到关键词时,会随机选择一条作为回复内容。 - -这里的 “插入随肌符” 是因为在拼多多平台等平台,是不允许每次重复一个回答的,所以可以插入一个随机符,以规避这个问题。 - -这里的 “插入文件” 则主要是用于插入图片,可以插入图片的链接,这样就可以回复图片了。 - -### 5、平台独立的 ChatGPT API 设置 -有时候,我们可能需要针对不同的平台设置不同的 ChatGPT API 地址,这时候就可以在这里设置。你可以基于 [懒人百宝箱](https://chat.lazaytools.top/) 实现自己的知识库,然后设置到这里。 - -![alt text](docs/other_settings_1.png) - -当设置了平台单独的 ChatGPT API 地址后,就会优先使用这个地址去调用 ChatGPT API,如果没有设置,则会使用上面设置的全局 ChatGPT API 地址。 - -### 6、客服相关设置 -![alt text](docs/other_settings_2.png) - -**提取信息**:勾选提取手机号或者提取咨询商品名后,它会去提取用户消息中的手机号或者商品名,然后将它存储到下面的路径中。 - -**等待回复时间**:当用户发送消息后,会等待这么长时间后再回复用户,如果希望马上回复,可以将这个值设置成零。 - -**上下文消息数**:当前使用 ChatGPT API 时,会将指定数量的聊天上下文,拿去调用 ChatGPT API,以便 ChatGPT API 更好的理解用户的问题。注意,这个值设置的越大,调用 ChatGPT API 的速度就会越慢。 - -**等待人工间隔**:当遇到 ChatGPT 阻塞的时候,会等待这么长时间然后终止客服自动任务,转交给人工客服手动处理。 - -## 项目计划 -- [ ] 支持拼多多、淘宝、京东等电商平台(如果急需可以私聊小助手) -- [ ] 支持本地模型的加载 - +```json +"scripts": { + // ... + "start": "ts-node ./.erb/scripts/check-port-in-use.js && pnpm run start:renderer", + "start:main": "cross-env NODE_ENV=development electronmon -r ts-node/register/transpile-only .", + "start:preload": "cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.preload.dev.ts", + "start:renderer": "cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack serve --config ./.erb/configs/webpack.config.renderer.dev.ts", + "test": "jest" +}, +``` diff --git a/electron-builder.yml b/electron-builder.yml index 5ec4d78..43eab80 100644 --- a/electron-builder.yml +++ b/electron-builder.yml @@ -27,4 +27,7 @@ directories: buildResources: assets output: release/build extraResources: - - "./assets/**" \ No newline at end of file + - "./assets/**" +# build: +# afterPack: "./removeLocales.js" +afterPack: "./removeLocales.js" \ No newline at end of file diff --git a/package.json b/package.json index 60646ba..9280d38 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "chatgpt-on-cs", "description": "多平台智能客服,允许使用 ChatGPT 作为客服机器人", - "version": "0.9.0", + "version": "1.0.2", "keywords": [ "electron", "boilerplate", diff --git a/release/app/package-lock.json b/release/app/package-lock.json index c2ccc11..7f48af5 100644 --- a/release/app/package-lock.json +++ b/release/app/package-lock.json @@ -1,12 +1,12 @@ { "name": "chatgpt-on-cs", - "version": "1.0.1", + "version": "1.0.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "chatgpt-on-cs", - "version": "1.0.1", + "version": "1.0.2", "hasInstallScript": true, "license": "AGPL-3.0" } diff --git a/release/app/package.json b/release/app/package.json index dcfa169..04bce87 100644 --- a/release/app/package.json +++ b/release/app/package.json @@ -1,6 +1,6 @@ { "name": "chatgpt-on-cs", - "version": "1.0.1", + "version": "1.0.2", "description": "多平台智能客服,允许使用 ChatGPT 作为客服机器人", "license": "AGPL-3.0", "author": { diff --git a/removeLocales.js b/removeLocales.js new file mode 100644 index 0000000..ec39b4e --- /dev/null +++ b/removeLocales.js @@ -0,0 +1,18 @@ +const fs = require('fs'); +const path = require('path'); + +module.exports = async function (params) { + // Assuming 'locales' directory is directly inside the app output directory + const localesDir = path.join(params.appOutDir, 'locales'); + + try { + const files = await fs.promises.readdir(localesDir); + for (const file of files) { + if (!file.endsWith('zh-CN.pak')) { + await fs.promises.unlink(path.join(localesDir, file)); + } + } + } catch (err) { + console.error('Error removing locales:', err); + } +}; diff --git a/src/main/main.ts b/src/main/main.ts index 1bfb6bb..e0fec09 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -18,6 +18,8 @@ import BackendServiceManager from './system/backend'; let mainWindow: BrowserWindow | null = null; let backendServiceManager: BackendServiceManager | null = null; +app.commandLine.appendSwitch('lang', 'zh-CN'); + const gotTheLock = app.requestSingleInstanceLock(); if (process.env.NODE_ENV === 'production') { diff --git a/src/renderer/hooks/useWebSocketContext.tsx b/src/renderer/hooks/useWebSocketContext.tsx index 7c794a0..59352b0 100644 --- a/src/renderer/hooks/useWebSocketContext.tsx +++ b/src/renderer/hooks/useWebSocketContext.tsx @@ -27,13 +27,14 @@ interface WebSocketContextType { const WebSocketContext = createContext(null); export const WebSocketProvider = ({ children }: { children: ReactNode }) => { + const [isConnected, setIsConnected] = useState(false); const { lastMessage, sendMessage } = useWebSocket( `ws://127.0.0.1:${window.electron.getPort()}/api/v1/event/ws`, { - shouldReconnect: () => { - return true; // 总是尝试重连 - }, + shouldReconnect: () => !isConnected, // 仅当未连接时尝试重连 reconnectInterval: 3000, + onOpen: () => setIsConnected(true), // 连接成功时设置为已连接 + onClose: () => setIsConnected(false), // 连接关闭时设置为未连接 }, ); const [eventHandlers, setEventHandlers] = useState< diff --git a/src/renderer/pages/About/index.tsx b/src/renderer/pages/About/index.tsx index 3881712..ccd7b4b 100644 --- a/src/renderer/pages/About/index.tsx +++ b/src/renderer/pages/About/index.tsx @@ -12,6 +12,9 @@ const AboutPage: React.FC = () => { ## 使用说明 项目文档: [懒人百宝箱使用说明](https://gitee.com/alsritter/ChatGPT-On-CS) +## 演示视频 +[哔哩哔哩](https://www.bilibili.com/video/BV1qz421Q73S) + ## 项目地址 * [GitHub](https://github.com/lrhh123/ChatGPT-On-CS) diff --git a/src/renderer/pages/Home/DriverSettings.tsx b/src/renderer/pages/Home/DriverSettings.tsx index b62c4ec..a9edb3a 100644 --- a/src/renderer/pages/Home/DriverSettings.tsx +++ b/src/renderer/pages/Home/DriverSettings.tsx @@ -26,7 +26,10 @@ const DriverSettings = () => { (async () => { try { - await updateRunner(isPaused, isKeywordMatch); + await updateRunner({ + is_paused: isPaused, + is_keyword_match: isKeywordMatch, + }); } catch (error: any) { console.error(error); } @@ -61,9 +64,15 @@ const DriverSettings = () => { }); } - updateRunner(checked, driverSettings.isKeywordMatch); + updateRunner({ + is_paused: checked, + is_keyword_match: driverSettings.isKeywordMatch, + }); } else if (field === 'isKeywordMatch') { - updateRunner(driverSettings.isPaused, checked); + updateRunner({ + is_paused: driverSettings.isPaused, + is_keyword_match: checked, + }); } }; diff --git a/src/renderer/pages/Home/PlatformTabs.tsx b/src/renderer/pages/Home/PlatformTabs.tsx index 1b17505..d493e56 100644 --- a/src/renderer/pages/Home/PlatformTabs.tsx +++ b/src/renderer/pages/Home/PlatformTabs.tsx @@ -5,6 +5,7 @@ import { Tab, TabPanels, TabPanel, + Tooltip, Checkbox, Stack, Image, @@ -25,7 +26,8 @@ import { } from '../../services/platform/constant'; import { useSystemStore } from '../../stores/useSystemStore'; import defaultPlatformIcon from '../../../../assets/base/default-platform-icon.png'; -import analytics from '../../services/analytics/index_template'; +import windowsIcon from '../../../../assets/base/windows.png'; +import analytics from '../../services/analytics'; const PlatformTabs = () => { const { data, isLoading } = useQuery(['platformList'], getPlatformList); @@ -95,6 +97,19 @@ const PlatformTabs = () => { {platform.name} + { + // 如果 id 前缀有 win_ 则显示一个小图标标识 + platform.id.startsWith('win_') && ( + + windows + + ) + } ))} diff --git a/src/renderer/pages/Home/index.tsx b/src/renderer/pages/Home/index.tsx index 3103e55..46a43f4 100644 --- a/src/renderer/pages/Home/index.tsx +++ b/src/renderer/pages/Home/index.tsx @@ -4,7 +4,7 @@ import PageContainer from '../../components/PageContainer'; import PlatformTabs from './PlatformTabs'; import DriverSettings from './DriverSettings'; import ReplyKeyword from './ReplyKeyword'; -import analytics from '../../services/analytics/index_template'; +import analytics from '../../services/analytics'; const HomePage = () => { useEffect(() => { diff --git a/src/renderer/pages/MsgList/index.tsx b/src/renderer/pages/MsgList/index.tsx index 56c8dfa..920834c 100644 --- a/src/renderer/pages/MsgList/index.tsx +++ b/src/renderer/pages/MsgList/index.tsx @@ -16,7 +16,7 @@ import { getMessageList, } from '../../services/platform/controller'; import SessionBox from './SessionBox'; -import analytics from '../../services/analytics/index_template'; +import analytics from '../../services/analytics'; import { Message } from '../../services/platform/platform'; // 假设数据通过 props.sessions 传递 diff --git a/src/renderer/pages/Platforms/index.tsx b/src/renderer/pages/Platforms/index.tsx index 5de2913..e2ef86c 100644 --- a/src/renderer/pages/Platforms/index.tsx +++ b/src/renderer/pages/Platforms/index.tsx @@ -33,7 +33,7 @@ import { Platform, PlatformSettings as PS, } from '../../services/platform/platform'; -import analytics from '../../services/analytics/index_template'; +import analytics from '../../services/analytics'; const PlatformSettings = () => { useEffect(() => { diff --git a/src/renderer/pages/Settings/GptSettings.tsx b/src/renderer/pages/Settings/GptSettings.tsx index d4d3629..f6e0761 100644 --- a/src/renderer/pages/Settings/GptSettings.tsx +++ b/src/renderer/pages/Settings/GptSettings.tsx @@ -10,6 +10,7 @@ import { Switch, Input, Select, + Highlight, Box, Slider, SliderFilledTrack, @@ -64,7 +65,12 @@ const GptSettings = () => { <> - GPT 地址设置 + + GPT 地址设置(尾部需要加上 /v1) + { useEffect(() => { diff --git a/src/renderer/services/platform/constant.ts b/src/renderer/services/platform/constant.ts index 427dac0..681795d 100644 --- a/src/renderer/services/platform/constant.ts +++ b/src/renderer/services/platform/constant.ts @@ -1,6 +1,7 @@ export enum PlatformTypeEnum { HOT = 'HOT', E_COMMERCE = 'E_COMMERCE', + ME_MEDIA = 'ME_MEDIA', RECRUIT = 'RECRUIT', OTHER = 'OTHER', LAW = 'LAW', @@ -11,5 +12,6 @@ export const PlatformTypeMap = { [PlatformTypeEnum.E_COMMERCE]: '电商', [PlatformTypeEnum.RECRUIT]: '招聘', [PlatformTypeEnum.LAW]: '法律咨询', + [PlatformTypeEnum.ME_MEDIA]: '自媒体', [PlatformTypeEnum.OTHER]: '其他', }; diff --git a/src/renderer/services/platform/controller.ts b/src/renderer/services/platform/controller.ts index c7bb3c6..dfdaaa6 100644 --- a/src/renderer/services/platform/controller.ts +++ b/src/renderer/services/platform/controller.ts @@ -19,11 +19,11 @@ export async function updatePlatform(ids: string[]) { await POST('/api/v1/base/platform', ids); } -export async function updateRunner(isPaused: boolean, isKeywordMatch: boolean) { - await POST('/api/v1/base/runner', { - is_paused: isPaused, - is_keyword_match: isKeywordMatch, - }); +export async function updateRunner(data: { + is_paused: boolean; + is_keyword_match: boolean; +}) { + await POST('/api/v1/base/runner', data); } export async function getReplyList({