Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

✨ 添加 Cookie 组件 #633

Open
wants to merge 109 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
109 commits
Select commit Hold shift + click to select a range
7913f74
:sparkles: 添加cookie相关的数据库表
suyiiyii Aug 22, 2024
c264ad3
:bug: stash
suyiiyii Aug 22, 2024
b655eff
:sparkles: 支持对话添加cookie
suyiiyii Aug 26, 2024
6f20dbf
:sparkles: 支持对话关联cookie到订阅目标
suyiiyii Aug 26, 2024
ffae6f2
:sparkles: 添加cookie的时候显示关联的cookie
suyiiyii Aug 26, 2024
c828fd9
:recycle: cookie 组件不再与 user 关联
suyiiyii Aug 31, 2024
1cd778c
:recycle: cookie 组件不再与 user 关联
suyiiyii Aug 31, 2024
7901b84
:sparkles: 初步实现携带cookie请求
suyiiyii Sep 2, 2024
4ce6b85
:sparkles: weibo 带 cookie mvp
suyiiyii Sep 3, 2024
055ed6e
:sparkles: 使用闭包实现client hook
suyiiyii Sep 3, 2024
498e7d6
:sparkles: 根据条件选择Cookie 和 状态回写数据库
suyiiyii Sep 3, 2024
01435ee
:sparkles: 提出assemble_client方法
suyiiyii Sep 3, 2024
3bd0867
:sparkles: 数据库Cookie表添加cd属性
suyiiyii Sep 5, 2024
370fc25
:sparkles: 数据库Cookie表添加is_universal属性
suyiiyii Sep 5, 2024
cf3966e
:sparkles: 添加cookie只显示支持的Platform
suyiiyii Sep 5, 2024
0ce2893
:sparkles: 匿名cookie和用户cookie一起调度
suyiiyii Sep 5, 2024
6537f01
:sparkles: 集中判断是否为CookieClientManager
suyiiyii Sep 5, 2024
b61bde6
:sparkles: 关联cookie时,只显示支持的订阅
suyiiyii Sep 5, 2024
afd1bee
:sparkles: 将get_cookie_friendly_name和valid_cookie移动到ccm内部
suyiiyii Sep 5, 2024
418a941
:sparkles: 添加不合法cookie的提示
suyiiyii Sep 6, 2024
06079b9
:sparkles: 关联cookie是不显示匿名cookie
suyiiyii Sep 6, 2024
eddd3e4
:sparkles: 修改_choose_cookie的逻辑以支持no target的Platform
suyiiyii Sep 6, 2024
bbc5492
:sparkles: 为匿名cookie设置标签
suyiiyii Sep 8, 2024
a622782
:recycle: 整理代码
suyiiyii Sep 8, 2024
61dcf87
:recycle: 整理代码
suyiiyii Sep 8, 2024
940301a
:sparkles: 取消关联cookie 对话
suyiiyii Sep 8, 2024
7c9e191
:sparkles: 删除cookie 对话
suyiiyii Sep 8, 2024
ce1f1bb
:sparkles: 又来改数据库了(
suyiiyii Sep 8, 2024
275bc0c
:recycles: 注释掉cookie相关代码,使得bison可以正常运行
suyiiyii Sep 8, 2024
4db7e7b
:recycles: DBConfig中 替换platform_name为site_name
suyiiyii Sep 8, 2024
f959e3e
:recycles: 仿照 platform_manager 添加 site_manager
suyiiyii Sep 9, 2024
65a5976
:recycles: CookieClientManager
suyiiyii Sep 9, 2024
d43d042
:recycles: add_cookie
suyiiyii Sep 9, 2024
404b1e4
:recycles: add_cookie_target
suyiiyii Sep 9, 2024
4a5e00c
:recycles: ddel_cookie_target
suyiiyii Sep 9, 2024
2c2c9a0
:recycle: del_cookie
suyiiyii Sep 9, 2024
318ba8f
:twisted_rightwards_arrows: merge
suyiiyii Sep 9, 2024
f865cef
:bug: 调整日志等级
suyiiyii Sep 12, 2024
5111baa
:bug: 应用部分推荐的重命名
suyiiyii Sep 12, 2024
4f73f8a
:bug: 弃用_cookie_client_manger_,改用issubclass判断是否为CookieClientManager
suyiiyii Sep 12, 2024
af246df
:sparkles: 俺又来改数据库哩
suyiiyii Sep 12, 2024
16331b5
:sparkles: 根据数据库的修改对应的逻辑,同时移除多余的init_cookie和_check_cookie
suyiiyii Sep 12, 2024
b25fcd9
:sparkles: 尝试添加一种可以跳过当前请求的方式
suyiiyii Sep 12, 2024
4b8d6a9
:bug: fix
suyiiyii Sep 13, 2024
4791fb6
:recycle: 重构 get_cookie 方法
suyiiyii Sep 13, 2024
2cfd583
:white_check_mark: pytest db_config
suyiiyii Sep 13, 2024
dd802a9
:white_check_mark: 初步实现添加cookie的单元测试
suyiiyii Sep 13, 2024
c784417
:white_check_mark: 初步实现删除cookie的单元测试
suyiiyii Sep 13, 2024
6cbc6f7
:twisted_rightwards_arrows: merge
suyiiyii Sep 19, 2024
76f2715
:sparkles: web api 初稿
suyiiyii Sep 19, 2024
d890d32
:sparkles: web api 初稿
suyiiyii Sep 19, 2024
c85e77c
:sparkles: web api 更新
suyiiyii Sep 19, 2024
94daf74
:sparkles: web api 初步完工
suyiiyii Sep 20, 2024
0aeeb28
:bug: t
suyiiyii Sep 21, 2024
43fb523
:twisted_rightwards_arrows: merge
suyiiyii Sep 21, 2024
54c9020
:sparkles: 添加cookie页面
suyiiyii Sep 21, 2024
db4b848
:sparkles: 添加 Cookie 界面
suyiiyii Sep 22, 2024
4c20e47
:sparkles: 添加 Cookie 增删查 功能
suyiiyii Sep 22, 2024
75a55c0
:sparkles: 添加 CookieTarget 页面
suyiiyii Sep 22, 2024
bb63529
:sparkles: 支持添加 CookieTarget
suyiiyii Sep 22, 2024
bc44e40
:sparkles: 支持删除 CookieTarget
suyiiyii Sep 22, 2024
6990f04
:sparkles: 支持删除 CookieTarget
suyiiyii Sep 22, 2024
0083f03
:sparkles: 支持删除 CookieTarget
suyiiyii Sep 22, 2024
cc31ef8
:sparkles: 听劝,修改部分样式 XD
suyiiyii Sep 22, 2024
59d4253
:sparkles: 听劝,修改部分样式 XD
suyiiyii Sep 22, 2024
8742de6
:sparkles: 在 cookie 中添加 cookie_name 字段
suyiiyii Sep 23, 2024
5d160dc
:sparkles: 导入导出支持 cookie
suyiiyii Sep 23, 2024
b04cbc2
:sparkles: 导入导出 cookie 优化代码
suyiiyii Sep 23, 2024
8fa456b
:memo: 尝试添加文档
suyiiyii Sep 26, 2024
54d37e2
:memo: 尝试添加文档
suyiiyii Sep 26, 2024
6b6bf9d
:lipstick: auto fix by pre-commit hooks
pre-commit-ci[bot] Sep 26, 2024
f31a798
:white_check_mark: 修修单测
suyiiyii Sep 26, 2024
7d3193d
:white_check_mark: 为什么前端 pnpm 和 yarn 的行为还不一样(
suyiiyii Sep 26, 2024
aa89793
:white_check_mark: 为什么 eslint 的warning都不让我过编译 (
suyiiyii Sep 27, 2024
1d1b9f6
:bug: config 中添加 clear_db 方法,用于清空数据库内容;添加clear_db fixture,用于在单测前后清空数据库
suyiiyii Sep 28, 2024
6c0efdd
:twisted_rightwards_arrows: merge main
suyiiyii Oct 8, 2024
1346d07
:sparkles: 修改cookie_site.get_cookie_name为异步
suyiiyii Oct 9, 2024
19345cf
:sparkles: 移动validate_cookie到CookieSite中
suyiiyii Oct 9, 2024
24251c2
:sparkles: (admin) 将site选择移动到侧边栏
suyiiyii Oct 9, 2024
5b8d044
:sparkles: (admin) 完善 将site选择移动到侧边栏
suyiiyii Oct 11, 2024
3f3cc2d
:bug: 更改命名siteName以符合小驼峰规范
suyiiyii Oct 11, 2024
a18b2e4
:sparkles: (admin) 支持添加cookie
suyiiyii Oct 11, 2024
7030758
:sparkles: (admin) 支持删除cookie
suyiiyii Oct 11, 2024
10bb617
:sparkles: (admin) 支持查看cookie详情
suyiiyii Oct 11, 2024
8174ec8
:sparkles: (admin) 支持查看cookie详情
suyiiyii Oct 11, 2024
6d8de1b
:sparkles: (admin) 支持添加cookieTarget
suyiiyii Oct 12, 2024
a941d77
:sparkles: (admin) 支持删除cookieTarget(
suyiiyii Oct 12, 2024
271e3e7
:wastebasket: 删除旧的CookieTargetManager
suyiiyii Oct 12, 2024
b1b8d37
:sparkles: (admin) console.log()忘记删了 (
suyiiyii Oct 12, 2024
f3d8b7d
:sparkles: 添加 cookie 时自动使用用户名命名(weibo)
suyiiyii Oct 13, 2024
b6ba904
:bug: 又忘记改单测了(
suyiiyii Oct 13, 2024
2093622
:bug: 改改单测
suyiiyii Oct 13, 2024
b2b20ab
:memo: 添加cookie模块使用文档
suyiiyii Oct 13, 2024
7aac134
:memo: 测试mermaid画图
suyiiyii Oct 14, 2024
cdc8de9
:memo: 试试流程图)
suyiiyii Oct 14, 2024
3773c77
:memo: 试试zenuml (
suyiiyii Oct 15, 2024
7622d3d
:memo: 好像可以用 zenuml 了 )
suyiiyii Oct 15, 2024
7359b3e
:memo: 怎么前端编译报错了(
suyiiyii Oct 16, 2024
5662775
:memo: 怎么前端编译报错了(
suyiiyii Oct 16, 2024
3c090db
:memo: 似乎可以了?
suyiiyii Oct 16, 2024
69ef94b
:memo: 破防了,不整zenuml了
suyiiyii Oct 16, 2024
0f4b0aa
:memo: 好像还是要加上sass-embedded这个库
suyiiyii Oct 16, 2024
c328967
:memo: 关于 Cookie 的开发指南
suyiiyii Oct 19, 2024
a78bb73
:sparkles: (admin) 添加验证Cookie有效性接口
suyiiyii Oct 21, 2024
6474504
:sparkles: (admin) 添加验证Cookie有效性
suyiiyii Oct 21, 2024
a090ff2
Merge branch 'MountainDash:main' into cookie
suyiiyii Oct 21, 2024
f5d30b9
:memo: 添加 获取Cookie 的文档
suyiiyii Oct 21, 2024
8d32145
:pencil2: 改改变量名
suyiiyii Oct 21, 2024
ff1c3c3
:sparkles: WebUI 中,允许查看 Cookie 的 content
suyiiyii Oct 21, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions admin-frontend/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import SubscribeManager from './features/subsribeConfigManager/SubscribeManager'
import WeightConfig from './features/weightConfig/WeightManager';
import Home from './pages/Home';
import Unauthed from './pages/Unauthed';
import CookieManager from './features/cookieManager/CookieManager';

function App() {
const dispatch = useAppDispatch();
Expand Down Expand Up @@ -46,6 +47,14 @@ function App() {
path: 'weight',
element: <WeightConfig />,
},
{
path: 'cookie',
element: <CookieManager />,
},
{
path: 'cookie/:siteName',
element: <CookieManager />,
},
],
},
], { basename: '/bison' });
Expand Down
8 changes: 7 additions & 1 deletion admin-frontend/src/app/store.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,16 @@ import globalConfReducer from '../features/globalConf/globalConfSlice';
import { subscribeApi } from '../features/subsribeConfigManager/subscribeConfigSlice';
import { targetNameApi } from '../features/targetName/targetNameSlice';
import { weightApi } from '../features/weightConfig/weightConfigSlice';
import { cookieApi, cookieTargetApi } from '../features/cookieManager/cookieConfigSlice';

const rootReducer = combineReducers({
auth: authReducer,
globalConf: globalConfReducer,
[subscribeApi.reducerPath]: subscribeApi.reducer,
[weightApi.reducerPath]: weightApi.reducer,
[targetNameApi.reducerPath]: targetNameApi.reducer,
[cookieApi.reducerPath]: cookieApi.reducer,
[cookieTargetApi.reducerPath]: cookieTargetApi.reducer,
});

const persistConfig = {
Expand All @@ -43,7 +46,10 @@ export const store = configureStore({
})
.concat(subscribeApi.middleware)
.concat(weightApi.middleware)
.concat(targetNameApi.middleware),
.concat(targetNameApi.middleware)
.concat(cookieApi.middleware)
.concat(cookieTargetApi.middleware),

});

export const persistor = persistStore(store);
Expand Down
78 changes: 78 additions & 0 deletions admin-frontend/src/features/cookieManager/CookieAddModal.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
import React, { useState } from 'react';
import { Form, Input, Modal } from '@arco-design/web-react';
import { useNewCookieMutation } from './cookieConfigSlice';
import { useAppDispatch } from '../../app/hooks';
import validateCookie from './cookieValidateReq';

interface CookieAddModalProps {
visible: boolean;
setVisible: (arg0: boolean) => void;
siteName: string;
}

function CookieAddModal({ visible, setVisible, siteName }: CookieAddModalProps) {
const FormItem = Form.Item;
const [content, setContent] = useState<string>('');
const [confirmLoading, setConfirmLoading] = useState(false);
const [newCookie] = useNewCookieMutation();
const dispatch = useAppDispatch();

const onSubmit = () => {
const postPromise: ReturnType<typeof newCookie> = newCookie({ siteName, content });
setConfirmLoading(true);
postPromise.then(() => {
setConfirmLoading(false);
setVisible(false);
setContent('');
});
};

return (
<Modal
title="添加 Cookie"
visible={visible}
onCancel={() => setVisible(false)}
confirmLoading={confirmLoading}
onOk={onSubmit}
style={{ maxWidth: '90vw' }}
>

<Form autoComplete="off">
<FormItem label="站点" required>
<Input placeholder="Please enter site name" value={siteName} disabled />
</FormItem>
<FormItem
label="Cookie"
required
field="content"
hasFeedback
rules={[
{
validator: (value, callback) => new Promise<void>((resolve) => {
dispatch(validateCookie(siteName, value))
.then((res) => {
if (res) {
callback();
} else {
callback('Cookie 格式错误');
}
resolve();
});
}),
},
]}

>
<Input.TextArea
placeholder="请输入 Cookie"
value={content}
onChange={setContent}
/>
</FormItem>

</Form>
</Modal>
);
}

export default CookieAddModal;
128 changes: 128 additions & 0 deletions admin-frontend/src/features/cookieManager/CookieEditModal.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
import React, { useState } from 'react';
import {
Button, Empty, Form, Input, Modal, Space, Table,
} from '@arco-design/web-react';
import { useDeleteCookieTargetMutation, useGetCookieTargetsQuery } from './cookieConfigSlice';
import { Cookie, CookieTarget } from '../../utils/type';
import CookieTargetModal from '../cookieTargetManager/CookieTargetModal';

interface CookieEditModalProps {
visible: boolean;
setVisible: (arg0: boolean) => void;
cookie: Cookie | null
}

function CookieEditModal({ visible, setVisible, cookie }: CookieEditModalProps) {
if (!cookie) {
return <Empty />;
}
const FormItem = Form.Item;
// const [confirmLoading, setConfirmLoading] = useState(false);
const [deleteCookieTarget] = useDeleteCookieTargetMutation();
// 获取 Cookie Target
const { data: cookieTargets } = useGetCookieTargetsQuery({ cookieId: cookie.id });

// 添加 Cookie Target
const [showAddCookieTargetModal, setShowAddCookieTargetModal] = useState(false);
const handleAddCookieTarget = () => () => {
setShowAddCookieTargetModal(true);
};

// 删除 Cookie Target
const handleDelete = (record: CookieTarget) => () => {
deleteCookieTarget({
cookieId: record.cookie_id,
target: record.target.target,
platformName: record.target.platform_name,
});
};
const columns = [
{
title: '平台名称',
dataIndex: 'target.platform_name',
},
{
title: '订阅名称',
dataIndex: 'target.target_name',

},
{
title: 'Cookie ID',
dataIndex: 'cookie_id',
},
{
title: '操作',
dataIndex: 'op',
render: (_: null, record: CookieTarget) => (
<Space size="small">
<Button type="text" status="danger" onClick={handleDelete(record)}>删除</Button>
</Space>
),
},
];

return (
<>
<Modal
title="编辑 Cookie"
visible={visible}
onCancel={() => setVisible(false)}
// confirmLoading={confirmLoading}
onOk={() => setVisible(false)}
style={{ maxWidth: '90vw', minWidth: '50vw' }}
>
<Form autoComplete="off">
<FormItem label="Cookie ID">
<Input disabled value={cookie.id.toString()} />
</FormItem>
<FormItem label="Cookie 名称">
<Input value={cookie.cookie_name} disabled />
</FormItem>
<FormItem label="所属站点">
<Input value={cookie.site_name} disabled />
</FormItem>
<FormItem label="内容">
<Input.TextArea
value={cookie.content}
disabled
/>
</FormItem>

<FormItem label="标签">
<Input.TextArea
value={JSON.stringify(cookie.tags)}
disabled
/>
</FormItem>

<FormItem label="最后使用时间">
<Input value={cookie.last_usage.toString()} disabled />
</FormItem>
<FormItem label="状态">
<Input value={cookie.status} disabled />
</FormItem>
<FormItem label="冷却时间(毫秒)">
<Input value={cookie.cd_milliseconds.toString()} disabled />
</FormItem>

</Form>

<Button type="primary" onClick={handleAddCookieTarget()}>关联 Cookie</Button>
<Table
columns={columns}
data={cookieTargets}
rowKey={(record: CookieTarget) => `${record.target.platform_name}-${record.target.target}`}
scroll={{ x: true }}
/>
</Modal>

<CookieTargetModal
cookie={cookie}
visible={showAddCookieTargetModal}
setVisible={setShowAddCookieTargetModal}
/>
</>
);
}

export default CookieEditModal;
13 changes: 13 additions & 0 deletions admin-frontend/src/features/cookieManager/CookieManager.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
.list-actions-icon {
display: flex;
align-items: center;
justify-content: center;
width: 24px;
height: 24px;
border-radius: 50%;
transition: all 0.1s;
}

.list-actions-icon:hover {
background-color: var(--color-fill-3);
}
111 changes: 111 additions & 0 deletions admin-frontend/src/features/cookieManager/CookieManager.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
import React from 'react';
import {
Button,
Table, TableColumnProps, Typography, Space, Popconfirm,
} from '@arco-design/web-react';
import { useParams } from 'react-router-dom';
import { useGetCookiesQuery, useDeleteCookieMutation } from './cookieConfigSlice';
import './CookieManager.css';
import { Cookie } from '../../utils/type';
import CookieAddModal from './CookieAddModal';
import CookieEditModal from './CookieEditModal';

export default function CookieManager() {
const { siteName } = useParams();
const { data: cookieDict } = useGetCookiesQuery();
const cookiesList = cookieDict ? Object.values(cookieDict) : [];

// 添加cookie
const [showAddModal, setShowAddModal] = React.useState(false);
const handleAddCookie = () => () => {
setShowAddModal(true);
};

// 删除cookie
const [deleteCookie] = useDeleteCookieMutation();
const handleDelCookie = (cookieId: string) => () => {
deleteCookie({
cookieId,
});
};

// 编辑cookie
const [showEditModal, setShowEditModal] = React.useState(false);
const [editCookie, setEditCookie] = React.useState<Cookie | null>(null);
const handleEditCookie = (cookie: Cookie) => () => {
setEditCookie(cookie);
setShowEditModal(true);
};

let data = [];
if (siteName) {
data = cookiesList.filter((tSite) => tSite.site_name === siteName);
}

const columns: TableColumnProps[] = [
{
title: 'ID',
dataIndex: 'id',
},
{
title: 'Cookie 名称',
dataIndex: 'cookie_name',
},
{
title: '所属站点',
dataIndex: 'site_name',
},
{
title: '最后使用时间',
dataIndex: 'last_usage',
},
{
title: '状态',
dataIndex: 'status',
},
{
title: 'CD',
dataIndex: 'cd_milliseconds',
}, {
title: '操作',
dataIndex: 'op',
render: (_: null, record: Cookie) => (
<Space size="small">
<Popconfirm
title={`确定删除 Cookie ${record.cookie_name} ?`}
onOk={handleDelCookie(record.id.toString())}
>
<span className="list-actions-icon">
{/* <IconDelete /> */}
<Button type="text" status="danger">删除</Button>
</span>
</Popconfirm>
<Button type="text" onClick={handleEditCookie(record)}>编辑</Button>
</Space>
),

},

];

return (
<>
<div>

<Typography.Title heading={4} style={{ margin: '15px' }}>Cookie 管理</Typography.Title>

<Button
style={{ width: '90px', margin: '20px 10px' }}
type="primary"
onClick={handleAddCookie()}
>
添加
</Button>
</div>

<Table columns={columns} data={data} />
<CookieAddModal visible={showAddModal} setVisible={setShowAddModal} siteName={siteName || ''} />
<CookieEditModal visible={showEditModal} setVisible={setShowEditModal} cookie={editCookie} />
</>
);
}
Loading
Loading