134 lines
4.9 KiB
Markdown
134 lines
4.9 KiB
Markdown
# Star Chart Search Enhancer
|
||
|
||
Chrome MV3 extension for the Xingtu creator market page.
|
||
|
||
## Development
|
||
|
||
```bash
|
||
npm install
|
||
npm test
|
||
npm run build
|
||
```
|
||
|
||
## Release Build
|
||
|
||
```bash
|
||
npm run build:release
|
||
npm run package:internal
|
||
```
|
||
|
||
- `npm run build` outputs the development bundle to `dist/`
|
||
- `npm run build:release` outputs the internal distribution bundle to `dist-release/`
|
||
- `npm run package:internal` creates `release/star-chart-search-enhancer-internal.zip`
|
||
- The extension ID is fixed to `pkjopdibdnomhogjheclhnknmejccffg`
|
||
|
||
## Load The Extension
|
||
|
||
1. Run `npm run build`
|
||
2. Open `chrome://extensions`
|
||
3. Enable developer mode
|
||
4. Choose `Load unpacked`
|
||
5. Select the `dist/` directory
|
||
|
||
## Current Scope
|
||
|
||
- Adds two after-search-rate columns to the Xingtu market list
|
||
- Adds a popup-based Logto auth entry
|
||
- Hydrates the current page immediately
|
||
- Provides plugin-owned filter, sort, and CSV export controls
|
||
- Gates the market tools until auth is available
|
||
- Triggers full-scan flow only when filter, sort, or export is used
|
||
|
||
## Auth Configuration
|
||
|
||
The Logto integration is wired with placeholder values in `src/shared/auth-config.ts`.
|
||
Replace these before real sign-in testing:
|
||
|
||
- `logtoEndpoint`
|
||
- `appId`
|
||
- `apiResource`
|
||
- Any extra scopes beyond `openid`, `profile`, and `offline_access`
|
||
|
||
The popup dev panel is controlled by `enableDevAuthPanel` and is disabled by default.
|
||
|
||
## Popup Behavior
|
||
|
||
1. Load the unpacked extension from `dist/`
|
||
2. Click the extension icon
|
||
3. Confirm the popup shows `登录 Logto` when unauthenticated
|
||
4. After real Logto config is added, use the popup to sign in and sign out
|
||
|
||
## Protected API Mock Test
|
||
|
||
1. Set `enableDevAuthPanel` to `true` in `src/shared/auth-config.ts`
|
||
2. Run `npm run mock:protected-api`
|
||
3. Run `npm run build`
|
||
4. Reload the unpacked extension from `dist/`
|
||
5. Open the popup and log in
|
||
6. Click `测试受保护接口`
|
||
7. Confirm the popup shows JSON containing `"source": "mock-protected-api"` and `"message": "authorized"`
|
||
|
||
## Batch Submit Mock Test
|
||
|
||
1. Run `npm run mock:protected-api`
|
||
2. Run `npm run build`
|
||
3. Reload the unpacked extension from `dist/`
|
||
4. Open `https://xingtu.cn/ad/creator/market`
|
||
5. Choose an export range in the plugin toolbar
|
||
6. Click `提交批次`
|
||
7. Enter a batch name in the browser prompt
|
||
8. Confirm the toolbar shows `批次提交成功`
|
||
9. Confirm the mock batch response accepts the payload
|
||
|
||
## Market Auth Gate
|
||
|
||
When the market page is opened without a valid auth state, the content script renders
|
||
`请先登录插件` and does not boot the filter, sort, or export toolbar.
|
||
|
||
## Manual Verification
|
||
|
||
1. Load the unpacked extension from `dist/`
|
||
2. Open `https://xingtu.cn/ad/creator/market`
|
||
3. Confirm the page shows the auth gate until login is available
|
||
4. After authentication is wired, confirm the two new columns appear
|
||
5. Confirm current-page rows move through loading and then render values or failure states
|
||
6. Apply a threshold filter and confirm the list hides unmatched rows
|
||
7. Apply a sort and confirm row order changes
|
||
8. Export CSV and confirm the file includes plugin status and after-search-rate fields
|
||
|
||
提交的数据格式
|
||
```json
|
||
{
|
||
"logtoUserId": "p7pdhhtde8kj",
|
||
"creatorName": "王少卿",
|
||
"resource": "https://talent-search.intelligrow.cn",
|
||
"batchName": "自动验证批次",
|
||
"createdAt": "<提交当时的 ISO 时间戳>",
|
||
"authors": [
|
||
{ "authorId": "7041184989643276324", "authorName": "旖旖小虎🐯" },
|
||
{ "authorId": "7021245050621263906", "authorName": "瑶一瑶小肉包" },
|
||
{ "authorId": "6629722292110753806", "authorName": "陈翔六点半" },
|
||
{ "authorId": "7065613279053217829", "authorName": "小花花的每一天" },
|
||
{ "authorId": "7254389871895117885", "authorName": "疯铲姐妹" },
|
||
{ "authorId": "7294473194298146854", "authorName": "奇奇de海洋" },
|
||
{ "authorId": "6834119701379940360", "authorName": "任志达" },
|
||
{ "authorId": "6870159718216630285", "authorName": "大师兄的表哥" },
|
||
{ "authorId": "6833914516833566727", "authorName": "旺仔是三七分" },
|
||
{ "authorId": "7401565089431552037", "authorName": "笑典动物园" },
|
||
{ "authorId": "7120107426002501639", "authorName": "嘻哈不拆" },
|
||
{ "authorId": "7015813716650393630", "authorName": "周星伦" },
|
||
{ "authorId": "6870170568893661197", "authorName": "周周的周" },
|
||
{ "authorId": "6839989503663276045", "authorName": "潇潇学姐" },
|
||
{ "authorId": "7023032374749298718", "authorName": "大自然奇观" },
|
||
{ "authorId": "6870164079617523719", "authorName": "王小怪" },
|
||
{ "authorId": "6969058840033624100", "authorName": "周三拾" },
|
||
{ "authorId": "6825383642127138829", "authorName": "罗臣臣" },
|
||
{ "authorId": "6684403430837977100", "authorName": "段炼丶Exercise" },
|
||
{ "authorId": "7319160797236559882", "authorName": "郑皓文" }
|
||
]
|
||
}
|
||
```
|
||
|
||
Internal distribution steps are documented in
|
||
`docs/internal-extension-distribution.md`.
|