feat: 企业信息展示模块静态交互完成

develop2
donghao 1 year ago
parent c86d2b7a9e
commit 6653b56737

@ -2,7 +2,7 @@
* @Author: donghao donghao@supervision.ltd
* @Date: 2024-03-27 14:56:27
* @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2024-04-15 15:13:38
* @LastEditTime: 2024-04-24 16:30:59
* @FilePath: \general-ai-manage\config\defaultSettings.ts
* @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/

@ -495,7 +495,7 @@
"username": {
"type": "string"
},
"psw": {
"pwd": {
"type": "string"
},
"autoLogin": {

@ -1,23 +0,0 @@
// @ts-ignore
import { Request, Response } from 'express';
export default {
'POST /employee/createEmployee': (req: Request, res: Response) => {
res.status(200).send({});
},
'DELETE /employee/deleteEmployee': (req: Request, res: Response) => {
res.status(200).send({});
},
'DELETE /employee/deleteEmployeeByIds': (req: Request, res: Response) => {
res.status(200).send({});
},
'POST /employee/getEmployeeById': (req: Request, res: Response) => {
res.status(200).send({});
},
'POST /employee/getEmployeeList': (req: Request, res: Response) => {
res.status(200).send({});
},
'PUT /employee/updateEmployee': (req: Request, res: Response) => {
res.status(200).send({});
},
};

@ -1,9 +1,12 @@
import { mockGetBusinessProjectData } from './pools/businessProjectData';
import {
mockGetBusinessAlgorithmData,
mockGetBusinessProjectData,
} from './pools/businessProjectData';
import { successMockApiProps } from './typing';
import { fetchCurrPageByList, fetchMockSuccessFullByOther } from './utils/apiMock';
export default {
// 企业列表
'GET /api/businessProject/': async (req: Request, res: Response) => {
'GET /api/businessProject/list': async (req: Request, res: Response) => {
// get 使用 query 读取参数
const { page, pageSize } = req.query;
const resData: successMockApiProps = {
@ -20,7 +23,7 @@ export default {
const { id } = req.query;
let finalData = {};
mockGetBusinessProjectData.data.results.forEach((item) => {
if (item.id === Number(id)) {
if (Number(item.id) === Number(id)) {
finalData = item;
// break;
}
@ -30,4 +33,16 @@ export default {
});
res.json(resData);
},
// 企业算法列表
'GET /api/businessProject/algorithm': async (req: Request, res: Response) => {
// get 使用 query 读取参数
const { page, pageSize } = req.query;
const resData: successMockApiProps = {
...fetchCurrPageByList({
...mockGetBusinessAlgorithmData,
data: { ...mockGetBusinessAlgorithmData.data, page, pageSize: pageSize || 10 },
}),
};
res.json(resData);
},
};

@ -1,13 +1,14 @@
/*
* @Author: donghao donghao@supervision.ltd
* @Date: 2024-04-02 15:42:40
* @Date: 2024-04-19 17:10:21
* @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2024-04-19 14:37:55
* @FilePath: \uighur-recognition-web2\mock\pools\warningRuleData.ts
* @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
* @LastEditTime: 2024-04-24 17:03:58
* @FilePath: \general-ai-platform-web\mock\pools\businessProjectData.ts
* @Description:
*/
/**@实时分析告警规则模块 */
// 告警规则分页
/**@企业项目首页模块 */
// 企业项目列表
export const mockGetBusinessProjectData = {
data: {
count: 7,
@ -102,3 +103,73 @@ export const mockGetBusinessProjectData = {
success: true,
status: 200,
};
/**@企业项目信息模块 */
// 企业算法列表
export const mockGetBusinessAlgorithmData = {
data: {
count: 5,
next: null,
previous: null,
results: [
{
id: '1',
name: '气泡缺陷检测', // 公司名称
typeName: '经典算法', // 算法类型 经典算法 深度学习
version: '1.6.25', // 版本
industry: 1003,
industryName: '食品、饮料、医疗卫生', // 公司所属行业
create_time: '2024-01-22T10:59:37',
update_time: '2024-04-01T17:53:40',
icon: '',
},
{
id: '2',
name: '未带安全帽识别', // 公司名称
typeName: '深度学习', // 算法类型 经典算法 深度学习
version: '3.1.09', // 版本
industry: 1004,
industryName: '通用', // 公司所属行业
create_time: '2024-01-22T10:59:37',
update_time: '2024-04-01T17:53:40',
icon: '',
},
{
id: '3',
name: '元器件(插件)混料检测', // 公司名称
typeName: '经典算法', // 算法类型 经典算法 深度学习
version: '2.4.18', // 版本
industry: 1005,
industryName: '手机、电子、SMT', // 公司所属行业
create_time: '2024-01-22T10:59:37',
update_time: '2024-04-01T17:53:40',
icon: '',
},
{
id: '4',
name: '中心孔缺陷检测', // 公司名称
typeName: '深度学习', // 算法类型 经典算法 深度学习
version: '1.0.89', // 版本
industry: 1006,
industryName: '锂电池', // 公司所属行业
create_time: '2024-01-22T10:59:37',
update_time: '2024-04-01T17:53:40',
icon: '',
},
{
id: '5',
name: '确定最佳剪切线位置', // 公司名称
typeName: '经典算法', // 算法类型 经典算法 深度学习
version: '2.2.55', // 版本
industry: 1007,
industryName: '钢铁、冶金、铸造', // 公司所属行业
create_time: '2024-01-22T10:59:37',
update_time: '2024-04-01T17:53:40',
icon: '',
},
],
},
msg: null,
success: true,
status: 200,
};

@ -1,41 +0,0 @@
/*
* @Author: donghao donghao@supervision.ltd
* @Date: 2024-04-02 14:08:47
* @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2024-04-02 17:27:11
* @FilePath: \uighur-recognition-web2\mock\recognitionPeople.ts
* @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
/**告警汇总模块 mock */
import {
mockGetRecognitionPeopleData,
mockGetUploadRecognitionPeopleData,
} from './pools/recognitionPeopleData';
import { successMockApiProps } from './typing';
import { fetchCurrPageByList } from './utils/apiMock';
export default {
// 实时分析告警汇总列表分页
'GET /api/recognition_people/': async (req: Request, res: Response) => {
// get 使用 query 读取参数
const { page, pageSize } = req.query;
const resData: successMockApiProps = {
...fetchCurrPageByList({
...mockGetRecognitionPeopleData,
data: { ...mockGetRecognitionPeopleData.data, page, pageSize: pageSize || 10 },
}),
};
res.json(resData);
},
// 离线分析告警汇总列表分页
'GET /api/upload_recognition_people/': async (req: Request, res: Response) => {
// get 使用 query 读取参数
const { page, pageSize } = req.query;
const resData: successMockApiProps = {
...fetchCurrPageByList({
...mockGetUploadRecognitionPeopleData,
data: { ...mockGetUploadRecognitionPeopleData.data, page, pageSize: pageSize || 10 },
}),
};
res.json(resData);
},
};

@ -1,324 +0,0 @@
module.exports = {
'GET /api/currentUser': {
data: {
name: 'Serati Ma',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png',
userid: '00000001',
email: 'antdesign@alipay.com',
signature: '海纳百川,有容乃大',
title: '交互专家',
group: '蚂蚁金服某某某事业群某某平台部某某技术部UED',
tags: [
{ key: '0', label: '很有想法的' },
{ key: '1', label: '专注设计' },
{ key: '2', label: '辣~' },
{ key: '3', label: '大长腿' },
{ key: '4', label: '川妹子' },
{ key: '5', label: '海纳百川' },
],
notifyCount: 12,
unreadCount: 11,
country: 'China',
geographic: {
province: { label: '浙江省', key: '330000' },
city: { label: '杭州市', key: '330100' },
},
address: '西湖区工专路 77 号',
phone: '0752-268888888',
},
},
'GET /api/rule': {
data: [
{
key: 99,
disabled: false,
href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
name: 'TradeCode 99',
owner: '曲丽丽',
desc: '这是一段描述',
callNo: 503,
status: '0',
updatedAt: '2022-12-06T05:00:57.040Z',
createdAt: '2022-12-06T05:00:57.040Z',
progress: 81,
},
{
key: 98,
disabled: false,
href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
name: 'TradeCode 98',
owner: '曲丽丽',
desc: '这是一段描述',
callNo: 164,
status: '0',
updatedAt: '2022-12-06T05:00:57.040Z',
createdAt: '2022-12-06T05:00:57.040Z',
progress: 12,
},
{
key: 97,
disabled: false,
href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
name: 'TradeCode 97',
owner: '曲丽丽',
desc: '这是一段描述',
callNo: 174,
status: '1',
updatedAt: '2022-12-06T05:00:57.040Z',
createdAt: '2022-12-06T05:00:57.040Z',
progress: 81,
},
{
key: 96,
disabled: true,
href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
name: 'TradeCode 96',
owner: '曲丽丽',
desc: '这是一段描述',
callNo: 914,
status: '0',
updatedAt: '2022-12-06T05:00:57.040Z',
createdAt: '2022-12-06T05:00:57.040Z',
progress: 7,
},
{
key: 95,
disabled: false,
href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
name: 'TradeCode 95',
owner: '曲丽丽',
desc: '这是一段描述',
callNo: 698,
status: '2',
updatedAt: '2022-12-06T05:00:57.040Z',
createdAt: '2022-12-06T05:00:57.040Z',
progress: 82,
},
{
key: 94,
disabled: false,
href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
name: 'TradeCode 94',
owner: '曲丽丽',
desc: '这是一段描述',
callNo: 488,
status: '1',
updatedAt: '2022-12-06T05:00:57.040Z',
createdAt: '2022-12-06T05:00:57.040Z',
progress: 14,
},
{
key: 93,
disabled: false,
href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
name: 'TradeCode 93',
owner: '曲丽丽',
desc: '这是一段描述',
callNo: 580,
status: '2',
updatedAt: '2022-12-06T05:00:57.040Z',
createdAt: '2022-12-06T05:00:57.040Z',
progress: 77,
},
{
key: 92,
disabled: false,
href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
name: 'TradeCode 92',
owner: '曲丽丽',
desc: '这是一段描述',
callNo: 244,
status: '3',
updatedAt: '2022-12-06T05:00:57.040Z',
createdAt: '2022-12-06T05:00:57.040Z',
progress: 58,
},
{
key: 91,
disabled: false,
href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
name: 'TradeCode 91',
owner: '曲丽丽',
desc: '这是一段描述',
callNo: 959,
status: '0',
updatedAt: '2022-12-06T05:00:57.040Z',
createdAt: '2022-12-06T05:00:57.040Z',
progress: 66,
},
{
key: 90,
disabled: true,
href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
name: 'TradeCode 90',
owner: '曲丽丽',
desc: '这是一段描述',
callNo: 958,
status: '0',
updatedAt: '2022-12-06T05:00:57.040Z',
createdAt: '2022-12-06T05:00:57.040Z',
progress: 72,
},
{
key: 89,
disabled: false,
href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
name: 'TradeCode 89',
owner: '曲丽丽',
desc: '这是一段描述',
callNo: 301,
status: '2',
updatedAt: '2022-12-06T05:00:57.040Z',
createdAt: '2022-12-06T05:00:57.040Z',
progress: 2,
},
{
key: 88,
disabled: false,
href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
name: 'TradeCode 88',
owner: '曲丽丽',
desc: '这是一段描述',
callNo: 277,
status: '1',
updatedAt: '2022-12-06T05:00:57.040Z',
createdAt: '2022-12-06T05:00:57.040Z',
progress: 12,
},
{
key: 87,
disabled: false,
href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
name: 'TradeCode 87',
owner: '曲丽丽',
desc: '这是一段描述',
callNo: 810,
status: '1',
updatedAt: '2022-12-06T05:00:57.040Z',
createdAt: '2022-12-06T05:00:57.040Z',
progress: 82,
},
{
key: 86,
disabled: false,
href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
name: 'TradeCode 86',
owner: '曲丽丽',
desc: '这是一段描述',
callNo: 780,
status: '3',
updatedAt: '2022-12-06T05:00:57.040Z',
createdAt: '2022-12-06T05:00:57.040Z',
progress: 22,
},
{
key: 85,
disabled: false,
href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
name: 'TradeCode 85',
owner: '曲丽丽',
desc: '这是一段描述',
callNo: 705,
status: '3',
updatedAt: '2022-12-06T05:00:57.040Z',
createdAt: '2022-12-06T05:00:57.040Z',
progress: 12,
},
{
key: 84,
disabled: true,
href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
name: 'TradeCode 84',
owner: '曲丽丽',
desc: '这是一段描述',
callNo: 203,
status: '0',
updatedAt: '2022-12-06T05:00:57.040Z',
createdAt: '2022-12-06T05:00:57.040Z',
progress: 79,
},
{
key: 83,
disabled: false,
href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
name: 'TradeCode 83',
owner: '曲丽丽',
desc: '这是一段描述',
callNo: 491,
status: '2',
updatedAt: '2022-12-06T05:00:57.040Z',
createdAt: '2022-12-06T05:00:57.040Z',
progress: 59,
},
{
key: 82,
disabled: false,
href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
name: 'TradeCode 82',
owner: '曲丽丽',
desc: '这是一段描述',
callNo: 73,
status: '0',
updatedAt: '2022-12-06T05:00:57.040Z',
createdAt: '2022-12-06T05:00:57.040Z',
progress: 100,
},
{
key: 81,
disabled: false,
href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
name: 'TradeCode 81',
owner: '曲丽丽',
desc: '这是一段描述',
callNo: 406,
status: '3',
updatedAt: '2022-12-06T05:00:57.040Z',
createdAt: '2022-12-06T05:00:57.040Z',
progress: 61,
},
{
key: 80,
disabled: false,
href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
name: 'TradeCode 80',
owner: '曲丽丽',
desc: '这是一段描述',
callNo: 112,
status: '2',
updatedAt: '2022-12-06T05:00:57.040Z',
createdAt: '2022-12-06T05:00:57.040Z',
progress: 20,
},
],
total: 100,
success: true,
pageSize: 20,
current: 1,
},
'POST /api/login/outLogin': { data: {}, success: true },
'POST /api/login/account': {
status: 'ok',
type: 'account',
currentAuthority: 'admin',
},
};

@ -1,41 +0,0 @@
/*
* @Author: donghao donghao@supervision.ltd
* @Date: 2024-04-02 15:48:44
* @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2024-04-02 17:07:30
* @FilePath: \uighur-recognition-web2\mock\travelTrack.ts
* @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
/**告警追踪模块 mock */
import { mockGetTravelTrackData, mockGetUploadTravelTrackData } from './pools/travelTrackData';
import { successMockApiProps } from './typing';
import { fetchCurrPageByList } from './utils/apiMock';
export default {
// 实时分析告警追踪分页
'GET /api/travel_track/': async (req: Request, res: Response) => {
// get 使用 query 读取参数
const { page, pageSize } = req.query;
const resData: successMockApiProps = {
...fetchCurrPageByList({
...mockGetTravelTrackData,
data: { ...mockGetTravelTrackData.data, page, pageSize: pageSize || 10 },
}),
};
res.json(resData);
},
// 离线分析告警追踪分页
'GET /api/upload_travel_track/': async (req: Request, res: Response) => {
// get 使用 query 读取参数
const { page, pageSize } = req.query;
const resData: successMockApiProps = {
...fetchCurrPageByList({
...mockGetUploadTravelTrackData,
data: { ...mockGetUploadTravelTrackData.data, page, pageSize: pageSize || 10 },
}),
};
res.json(resData);
},
};
// \upload_travel_track

@ -2,15 +2,20 @@
* @Author: donghao donghao@supervision.ltd
* @Date: 2024-01-24 15:21:35
* @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2024-01-24 16:36:07
* @LastEditTime: 2024-04-24 10:09:34
* @FilePath: \general-ai-platform-web\mock\typing.ts
* @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
type metaProps = {
code: number; // 接口状态码 200 成功
};
/**成功返回数据结构 */
export interface successMockApiProps {
data: any; // mock业务层数据
meta: metaProps; // 接口信息
status: number; // 200 成功
success: boolean; // true 成功
data: any; // mock业务层数据
msg: string | undefined; // 成功提示
isMock: boolean; // true 标识当前是模拟数据
}
@ -18,6 +23,7 @@ export interface successMockApiProps {
/**失败返回数据结构 */
export interface failMockApiProps {
status?: number; // 500 失败
meta: metaProps; // 接口信息
success: boolean; // false 失败
data: any; // mock业务层数据
msg: string | undefined; // 成功提示

@ -31,9 +31,9 @@ const getAccess = () => {
export default {
// 登录
'POST /api/v1/login': async (req: Request, res: Response) => {
const { psw, username, type } = req.body;
const { pwd, username, type } = req.body;
await waitTime(1000);
if (psw === 'Sju2984?' && username === 'admin') {
if (pwd === 'Sju2984?' && username === 'admin') {
const adminData: successMockApiProps = {
...fetchMockSuccessFullByOther(mockBaseLoginData),
};
@ -42,7 +42,7 @@ export default {
return;
}
// TODO 以下未做任何处理
// if (psw === 'ant.design' && username === 'user') {
// if (pwd === 'ant.design' && username === 'user') {
// res.send({
// status: 'ok',
// type,

@ -2,7 +2,7 @@
* @Author: donghao donghao@supervision.ltd
* @Date: 2024-01-24 15:08:23
* @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2024-04-02 10:03:02
* @LastEditTime: 2024-04-24 11:25:48
* @FilePath: \general-ai-platform-web\mock\utils\apiMock.ts
* @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
@ -10,20 +10,20 @@
import { failMockApiProps, successMockApiProps } from '../typing';
export function fetchMockSuccessFullByOther({ data, msg }): successMockApiProps {
return {
status: 200, // 0 成功状态码
success: true, // true 成功
data: data || null, // mock业务层数据
msg: msg | 'ok', // 成功提示
meta: {
code: 200, // 成功状态码
},
isMock: true, // true 标识当前是模拟数据
} as successMockApiProps;
}
export function fetchMockFailFullByOther({ data, msg }): failMockApiProps {
return {
status: 500, // 失败状态码
success: true, // true 成功
data: data || null, // mock业务层数据
msg: msg | 'fail', // 成功提示
meta: {
code: 500, // 失败状态码
},
isMock: true, // true 标识当前是模拟数据
} as failMockApiProps;
}

@ -1,31 +0,0 @@
/**告警列表模块 mock */
import { mockGetUploadWarningInfoData, mockGetWarningInfoData } from './pools/warningInfoData';
import { successMockApiProps } from './typing';
import { fetchCurrPageByList } from './utils/apiMock';
export default {
// 实时分析告警列表分页
'GET /api/warning_info/': async (req: Request, res: Response) => {
// get 使用 query 读取参数
const { page, pageSize } = req.query;
const resData: successMockApiProps = {
...fetchCurrPageByList({
...mockGetWarningInfoData,
data: { ...mockGetWarningInfoData.data, page, pageSize: pageSize || 10 },
}),
};
res.json(resData);
},
// 离线分析告警列表分页
'GET /api/upload_warning_info/': async (req: Request, res: Response) => {
// get 使用 query 读取参数
const { page, pageSize } = req.query;
const resData: successMockApiProps = {
...fetchCurrPageByList({
...mockGetUploadWarningInfoData,
data: { ...mockGetUploadWarningInfoData.data, page, pageSize: pageSize || 10 },
}),
};
res.json(resData);
},
};

@ -1,30 +0,0 @@
/**告警规则模块 mock */
import { mockGetUploadWarningRuleData, mockGetWarningRuleData } from './pools/warningRuleData';
import { successMockApiProps } from './typing';
import { fetchCurrPageByList } from './utils/apiMock';
export default {
// 实时分析告警规则分页
'GET /api/warning_rule/': async (req: Request, res: Response) => {
// get 使用 query 读取参数
const { page, pageSize } = req.query;
const resData: successMockApiProps = {
...fetchCurrPageByList({
...mockGetWarningRuleData,
data: { ...mockGetWarningRuleData.data, page, pageSize: pageSize || 10 },
}),
};
res.json(resData);
},
// 离线分析告警规则分页
'GET /api/upload_warning_rule/': async (req: Request, res: Response) => {
// get 使用 query 读取参数
const { page, pageSize } = req.query;
const resData: successMockApiProps = {
...fetchCurrPageByList({
...mockGetUploadWarningRuleData,
data: { ...mockGetUploadWarningRuleData.data, page, pageSize: pageSize || 10 },
}),
};
res.json(resData);
},
};

@ -54,6 +54,7 @@
"antd-style": "^3.6.1",
"classnames": "^2.5.1",
"js-yaml": "^4.1.0",
"less": "^4.2.0",
"omit.js": "^2.0.2",
"querystring": "^0.2.1",
"rc-menu": "^9.12.4",

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 413 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 658 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 379 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 542 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

@ -2,7 +2,6 @@
height: calc(100vh);
padding: 0;
/* TODO 替换整体页面背景图 */
background: #F8FAFD;
}
.app_page_wrap .ant-pro-layout .ant-pro-layout-content {
position: relative;
@ -23,7 +22,9 @@
width: calc(100vw - 200px);
min-width: 100px;
height: 50px;
z-index: 999;
padding: 0 24px 0 20px;
background-color: #f8fafd;
}
.app_page_wrap .page_body .body_nav_bar .avatar_box > img {
width: 40px;

@ -3,7 +3,6 @@
height: calc(100vh);
padding: 0;
/* TODO 替换整体页面背景图 */
background: #f8fafd;
.ant-pro-layout .ant-pro-layout-content {
position: relative;
display: flex;
@ -19,12 +18,12 @@
position: fixed;
top: 0;
right: 0;
z-index: 999;
width: calc(100vw - 200px);
min-width: 100px;
height: 50px;
// z-index: 999;
padding: 0 24px 0 20px;
// background-color: red;
background-color: #f8fafd;
.avatar_box {
& > img {
width: 40px;

@ -53,7 +53,7 @@ export async function getInitialState(): Promise<{
let localRes: any = {};
localData.forEach((v) => {
// console.log(v.title,'localData_v')
localRes[`menu${v.name}`] = v.title;
localRes[`menu.${v.name}`] = v.title;
});
console.log(localRes, 'getAllRouteNameTile');
addLocale('zh-CN', localRes, {
@ -145,14 +145,17 @@ export const layout: RunTimeLayoutConfig = ({ initialState, setInitialState }) =
// if (initialState?.loading) return <PageLoading />;
return (
<div className="flex app_page_wrap">
<MenuBar
menuData={initialState?.menuData}
changeMenu={(record) => setCurrMenu(record)}
></MenuBar>
<div style={{ width: '200px', position: 'relative' }}>
<MenuBar
menuData={initialState?.menuData}
changeMenu={(record) => setCurrMenu(record)}
></MenuBar>
</div>
<div className="page_body">
<div className="flex items-center justify-between body_nav_bar">
<span>
{intl.formatMessage({ id: `menu-${currMenu?.name}`, defaultMessage: '首页' })}
{currMenu?.name &&
intl.formatMessage({ id: `menu.${currMenu?.name}`, defaultMessage: '首页' })}
</span>
<div>
{initialState?.currentUser?.userName ? (
@ -178,6 +181,7 @@ export const layout: RunTimeLayoutConfig = ({ initialState, setInitialState }) =
enableDarkTheme
settings={initialState?.settings}
onSettingChange={(settings) => {
console.log(settings, 'settings');
setInitialState((preInitialState) => ({
...preInitialState,
settings,

@ -1,3 +1,20 @@
/* 颜色 */
.color_0 {
color: #000000;
}
.color_1 {
color: #333333;
}
.color_2 {
color: #666666;
}
.color_3 {
color: #999999;
}
.bg_active_1 {
background: #EBF3FF;
}
/* 标题 */
.h1 {
color: #000000;
font-weight: bold;
@ -8,3 +25,24 @@
text-align: left;
text-transform: none;
}
.head5 {
color: #333333;
font-weight: bold;
font-size: 16px;
font-family: PingFang SC, PingFang SC;
font-style: normal;
line-height: 19px;
text-align: left;
text-transform: none;
}
/* 段落 */
.p1 {
color: #666666;
font-weight: 400;
font-size: 14px;
font-family: PingFang SC, PingFang SC;
font-style: normal;
line-height: 22px;
text-align: left;
text-transform: none;
}

@ -1,3 +1,23 @@
/* 颜色 */
.color_0 {
color: #000000;
}
.color_1 {
color: #333333;
}
.color_2 {
color: #666666;
}
.color_3 {
color: #999999;
}
// 背景
.bg_active_1 {
background: #ebf3ff;
}
/* 标题 */
.h1 {
color: #000000;
font-weight: bold;
@ -8,3 +28,29 @@
text-align: left;
text-transform: none;
}
.head5 {
color: #333333;
font-weight: bold;
font-size: 16px;
font-family: PingFang SC, PingFang SC;
font-style: normal;
line-height: 19px;
text-align: left;
text-transform: none;
}
/* 段落 */
.p1 {
color: #666666;
font-weight: 400;
font-size: 14px;
font-family: PingFang SC, PingFang SC;
font-style: normal;
line-height: 22px;
text-align: left;
text-transform: none;
}
body {
}

@ -1,5 +1,10 @@
.menubar_wrap {
position: fixed;
left: 0;
top: 0;
height: 100vh;
display: flex;
z-index: 999;
width: 200px;
padding: 0;
background-color: #fff;
@ -28,9 +33,9 @@
}
.menubar_wrap .ant-menu,
.menubar_wrap .ant-menu-item {
width: 100%;
margin: 0;
padding: 0;
width: 100%;
}
.menubar_wrap .ant-menu-item-icon {
width: 20px;

@ -1,9 +1,14 @@
@menubar_ThemeColor: #fff;
@themeColor: #154ddd;
.menubar_wrap {
position: fixed;
top: 0;
left: 0;
z-index: 999;
display: flex;
// flex: 1;
width: 200px;
height: 100vh;
padding: 0;
background-color: @menubar_ThemeColor;
border-radius: 0px 0px 32px 0px;

@ -2,7 +2,7 @@
* @Author: donghao donghao@supervision.ltd
* @Date: 2024-03-27 16:03:20
* @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2024-04-22 17:10:55
* @LastEditTime: 2024-04-23 10:48:58
* @FilePath: \general-ai-manage\src\components\Header\index.tsx
* @Description: layout
*/
@ -118,7 +118,7 @@ const MenuBar: React.FC<MenuBarProps> = ({ menuData, changeMenu }) => {
>
{menuData.map((menuItem) => (
<Menu.Item key={menuItem.key} icon={menuItem.icon} onClick={() => menuClick(menuItem)}>
{intl.formatMessage({ id: `menu-${menuItem.name}`, defaultMessage: '菜单' })}
{intl.formatMessage({ id: `menu.${menuItem.name}`, defaultMessage: '菜单' })}
</Menu.Item>
))}
</Menu>

@ -61,17 +61,33 @@ ol {
padding-inline: 0;
padding-block: 0;
}
/* 单行显示的搜索表单 */
.single-search-form-item .ant-form-item {
margin-bottom: 0;
}
/* Card */
.gn_card > .ant-pro-card-header {
margin: 0;
padding: 10px 16px;
height: 54px;
border-bottom: 1px solid #E0E0E0;
}
.gn_card > .ant-pro-card-body {
margin: 0;
padding: 16px 16px 0;
}
.gn_head_card {
padding: 0 20px;
overflow: hidden;
border-radius: 8px;
}
/* Form */
.gn_form .ant-form-item {
margin-bottom: 16px;
}
.gn_form .ant-pro-form-group-container {
gap: 0px 12px !important;
}
/* 单行显示的搜索表单 */
.single-search-form-item .ant-form-item {
margin-bottom: 0;
}
/* Form */
.gn_table_query_filter {
padding: 20px 0;
}
@ -83,7 +99,6 @@ ol {
}
/* Descriptions */
.gn_table_descriptions {
margin-bottom: 20px;
padding: 16px 16px 0;
background: #ffffff;
border-radius: 8px;
@ -107,21 +122,6 @@ ol {
padding: 0;
}
/* 主题样式 */
.ant-btn-primary,
.ant-btn-primary:not(:disabled):not(.ant-btn-disabled):hover {
background-color: #154ddd;
}
.ant-btn-default:not(:disabled):not(.ant-btn-disabled):hover,
.ant-btn-link {
color: #154ddd;
}
:where(.css-dev-only-do-not-override-42nv3w).ant-btn-default:not(:disabled):not(
.ant-btn-disabled
):hover {
color: #154ddd;
background: #ffffff;
border-color: #154ddd;
}
/* 单行文本溢出显示省略号 */
.single_line {
overflow: hidden;
@ -140,6 +140,9 @@ ol {
-webkit-line-clamp: 2;
/* 限制显示的行数 */
}
.ant-pro-layout .ant-pro-layout-bg-list {
background: #F8FAFD;
}
::-webkit-scrollbar-track-piece {
-webkit-border-radius: 0;
}

@ -2,7 +2,6 @@
// @tailwind base;
@tailwind components;
@tailwind utilities;
@theme_color: #154ddd;
html,
@ -78,6 +77,34 @@ ol {
}
}
/* 单行显示的搜索表单 */
.single-search-form-item {
.ant-form-item {
margin-bottom: 0;
}
}
/* Card */
.gn_card {
& > .ant-pro-card-header {
height: 54px;
margin: 0;
padding: 10px 16px;
border-bottom: 1px solid #e0e0e0;
}
& > .ant-pro-card-body {
margin: 0;
padding: 16px 16px 0;
}
}
.gn_head_card {
padding: 0 20px;
overflow: hidden;
border-radius: 8px;
border-radius: 8px;
}
/* Form */
// 通用表单
.gn_form {
.ant-form-item {
margin-bottom: 16px;
@ -88,14 +115,6 @@ ol {
}
}
/* 单行显示的搜索表单 */
.single-search-form-item {
.ant-form-item {
margin-bottom: 0;
}
}
/* Form */
// 筛选表单
.gn_table_query_filter {
padding: 20px 0;
@ -110,7 +129,6 @@ ol {
/* Descriptions */
// 筛选表单
.gn_table_descriptions {
margin-bottom: 20px;
padding: 16px 16px 0;
background: #ffffff;
border-radius: 8px;
@ -140,21 +158,21 @@ ol {
}
/* 主题样式 */
.ant-btn-primary,
.ant-btn-primary:not(:disabled):not(.ant-btn-disabled):hover {
background-color: @theme_color;
}
.ant-btn-default:not(:disabled):not(.ant-btn-disabled):hover,
.ant-btn-link {
color: @theme_color;
}
:where(.css-dev-only-do-not-override-42nv3w).ant-btn-default:not(:disabled):not(
.ant-btn-disabled
):hover {
color: @theme_color;
background: #ffffff;
border-color: @theme_color;
}
// .ant-btn-primary,
// .ant-btn-primary:not(:disabled):not(.ant-btn-disabled):hover {
// background-color: @theme_color;
// }
// .ant-btn-default:not(:disabled):not(.ant-btn-disabled):hover,
// .ant-btn-link {
// color: @theme_color;
// }
// :where(.css-dev-only-do-not-override-42nv3w).ant-btn-default:not(:disabled):not(
// .ant-btn-disabled
// ):hover {
// color: @theme_color;
// background: #ffffff;
// border-color: @theme_color;
// }
/* 单行文本溢出显示省略号 */
.single_line {
@ -171,6 +189,10 @@ ol {
-webkit-line-clamp: 2; /* 限制显示的行数 */
}
.ant-pro-layout .ant-pro-layout-bg-list {
background: #f8fafd;
}
// 美化滚动条
::-webkit-scrollbar-track-piece {
-webkit-border-radius: 0;

@ -1,3 +1,11 @@
/*
* @Author: donghao donghao@supervision.ltd
* @Date: 2024-04-19 17:10:21
* @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2024-04-24 15:05:21
* @FilePath: \general-ai-platform-web\src\hooks\useCity.tsx
* @Description:
*/
import { provinceAndCityEnum } from '@/enums/city';
export type useCityProps = {
formatProvinceByData: () => { label: string; value: string; children?: Record<string, any>[] }[];
@ -16,7 +24,6 @@ export const useCity: useCityProps = () => {
return provinceCityData;
}
// formatCityByProvinceData
function formatCityByProvinceData(arg1) {
const cityData = arg1?.children?.map((item) => {
item.label = item.cityName;

@ -2,32 +2,45 @@
* @Author: donghao donghao@supervision.ltd
* @Date: 2024-04-07 15:25:23
* @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2024-04-17 10:57:27
* @LastEditTime: 2024-04-24 16:31:35
* @FilePath: \general-ai-manage\src\layouts\HomeLayout.tsx
* @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
// import less from 'less';
import { AvatarDropdown, AvatarName } from '@/components';
import { useModel } from '@@/exports';
import { SettingDrawer } from '@ant-design/pro-components';
import { Outlet, history, useIntl, useLocation } from '@umijs/max';
import { Layout, Radio } from 'antd';
import { ConfigProvider, Layout, Radio, theme } from 'antd';
import React, { useEffect, useState } from 'react';
// public/home/logo.svg
// import defaultSettings from '../../config/defaultSettings';
import less from 'less';
import { outerMenuRoute } from '../../config/routes';
import './homeLayout.less';
const isDev = false;
const { Header, Content } = Layout;
const HomeLayout: React.FC = () => {
// const { initialState, setInitialState } = useModel('@@initialState');
const { initialState, setInitialState } = useModel('@@initialState');
// const { token } = theme.useToken();
const intl = useIntl();
const location = useLocation();
const [currRoute, setCurrRoute] = useState<Record<string, any>>({});
const [homeRoutes, setHomeRoutes] = useState<Record<string, any>[]>([]);
// setInitialState((preInitialState) => ({
// ...preInitialState,
// defaultSettings,
// }));
console.log('initialState', initialState);
/**设置当前菜单信息 */
function fetchCurrRoute(record: Record<string, any>) {
const currPath = record.path;
@ -97,83 +110,120 @@ const HomeLayout: React.FC = () => {
console.log('useEffect_location', location);
}, [location]);
const changeThemeColor = async () => {
try {
const newColor = '#f5222d'; // 设置新的主题颜色
await less.modifyVars({
'@primary-color': newColor,
});
console.log(less, 'changeThemeColor_less', theme);
} catch (error) {
console.error('Failed to update theme', error);
}
};
useEffect(() => {
// 调用修改主题颜色的函数
changeThemeColor();
}, []);
return (
<div className="homeLayout_wrap">
<Layout>
{/* 一级菜单 */}
<Header className="flex items-center justify-between">
<div className="flex items-center">
<div className="home_logo mr-[48px]"></div>
<ul className="flex first_menu_box">
{homeRoutes.map((menuItem) => {
return (
// TODO 二级菜单切换一级菜单未能正常回显
<li
<ConfigProvider prefixCls="ant">
<Layout>
{/* 一级菜单 */}
<Header className="flex items-center justify-between">
<div className="flex items-center">
<div className="home_logo mr-[48px]"></div>
<ul className="flex first_menu_box">
{homeRoutes.map((menuItem) => {
return (
// TODO 二级菜单切换一级菜单未能正常回显
<li
key={menuItem.key}
onClick={() => tabRouter(menuItem)}
className={[
currRoute?.path === menuItem.path ||
currRoute?.subMenu?.includes(currRoute?.path)
? 'activeMenu'
: '',
]}
>
{intl.formatMessage({ id: `menu.${menuItem.name}`, defaultMessage: '$$$' })}
</li>
);
})}
</ul>
</div>
<div className="home_nav_action">
<AvatarDropdown menu={true}>
<div className="flex items-center cursor-pointer avatar_box">
<img
className="mr-[8px] h-[40px]"
src="https://img2.baidu.com/it/u=1374514083,943518806&fm=253&fmt=auto&app=138&f=PNG?w=500&h=500"
/>
<AvatarName></AvatarName>
</div>
</AvatarDropdown>
</div>
</Header>
{/* 二级菜单 */}
{/* //TODO 按UI图调整二级菜单栏效果 */}
{currRoute?.subMenu && !currRoute?.isHideMenu && (
<Radio.Group
className="mx-[32px] mb-[12px]"
defaultValue={currRoute?.path}
buttonStyle="solid"
>
{currRoute.subMenu.map((menuItem) => {
return menuItem?.isHideMenu ? (
<></>
) : (
<Radio.Button
value={menuItem.path}
key={menuItem.key}
onClick={() => tabRouter(menuItem)}
className={[
currRoute?.path === menuItem.path ||
currRoute?.subMenu?.includes(currRoute?.path)
? 'activeMenu'
: '',
]}
className={[currRoute?.path === menuItem.path ? 'activeMenu' : '']}
>
{intl.formatMessage({ id: `menu.${menuItem.name}`, defaultMessage: '$$$' })}
</li>
<div className="flex justify-center items-center w-[120px]">
<div
className="mr-[4px]"
style={{ width: 14, height: 14, background: 'white' }}
></div>
{intl.formatMessage({ id: `menu.${menuItem.name}`, defaultMessage: '$$$' })}
{currRoute?.isHideMenu}
</div>
</Radio.Button>
);
})}
</ul>
</div>
<div className="home_nav_action">
<AvatarDropdown menu={true}>
<div className="flex items-center cursor-pointer avatar_box">
<img
className="mr-[8px] h-[40px]"
src="https://img2.baidu.com/it/u=1374514083,943518806&fm=253&fmt=auto&app=138&f=PNG?w=500&h=500"
/>
<AvatarName></AvatarName>
</div>
</AvatarDropdown>
</div>
</Header>
{/* 二级菜单 */}
{/* //TODO 按UI图调整二级菜单栏效果 */}
{currRoute?.subMenu && !currRoute?.isHideMenu && (
<Radio.Group
className="mx-[32px] mb-[12px]"
defaultValue={currRoute?.path}
buttonStyle="solid"
>
{currRoute.subMenu.map((menuItem) => {
return menuItem?.isHideMenu ? (
<></>
) : (
<Radio.Button
value={menuItem.path}
key={menuItem.key}
onClick={() => tabRouter(menuItem)}
className={[currRoute?.path === menuItem.path ? 'activeMenu' : '']}
>
<div className="flex justify-center items-center w-[120px]">
<div
className="mr-[4px]"
style={{ width: 14, height: 14, background: 'white' }}
></div>
{intl.formatMessage({ id: `menu.${menuItem.name}`, defaultMessage: '$$$' })}
{currRoute?.isHideMenu}
</div>
</Radio.Button>
);
})}
</Radio.Group>
)}
<Content>
<div className="home-layout-content">
<Outlet></Outlet>
</div>
</Content>
{/* <Footer style={{ textAlign: 'center' }}>苏胜天 ©2024</Footer> */}
</Layout>
</Radio.Group>
)}
<Content>
<div className="home-layout-content">
{/* <div>
<Button type='primary'>Button</Button>
</div> */}
<Outlet></Outlet>
</div>
</Content>
{/* <Footer style={{ textAlign: 'center' }}>苏胜天 ©2024</Footer> */}
</Layout>
</ConfigProvider>
{isDev && (
<SettingDrawer
disableUrlParams
enableDarkTheme
settings={initialState?.settings}
onSettingChange={(settings) => {
console.log(settings, 'settings');
setInitialState((preInitialState) => ({
...preInitialState,
settings,
}));
}}
/>
)}
</div>
);
};

@ -7,8 +7,8 @@ export default {
'pages.login.success': 'সফল লগইন!',
'pages.login.username.placeholder': 'ব্যবহারকারীর নাম: admin or user',
'pages.login.username.required': 'আপনার ব্যবহারকারীর নাম ইনপুট করুন!',
'pages.login.psw.placeholder': 'পাসওয়ার্ড: ant.design',
'pages.login.psw.required': 'আপনার পাসওয়ার্ড ইনপুট করুন!',
'pages.login.pwd.placeholder': 'পাসওয়ার্ড: ant.design',
'pages.login.pwd.required': 'আপনার পাসওয়ার্ড ইনপুট করুন!',
'pages.login.phoneLogin.tab': 'ফোন লগইন',
'pages.login.phoneLogin.errorMessage': 'যাচাইকরণ কোড ত্রুটি',
'pages.login.phoneNumber.placeholder': 'ফোন নম্বর',

@ -24,8 +24,8 @@ export default {
'app.settings.security.strong': 'শক্তিশালী',
'app.settings.security.medium': 'মধ্যম',
'app.settings.security.weak': 'দুর্বল',
'app.settings.security.psw': 'অ্যাকাউন্টের পাসওয়ার্ড',
'app.settings.security.psw-description': 'বর্তমান পাসওয়ার্ড শক্তি',
'app.settings.security.pwd': 'অ্যাকাউন্টের পাসওয়ার্ড',
'app.settings.security.pwd-description': 'বর্তমান পাসওয়ার্ড শক্তি',
'app.settings.security.phone': 'সুরক্ষা ফোন',
'app.settings.security.phone-description': 'আবদ্ধ ফোন',
'app.settings.security.question': 'নিরাপত্তা প্রশ্ন',
@ -46,8 +46,8 @@ export default {
'app.settings.binding.dingding': 'বাঁধাই ডিঙ্গটালক',
'app.settings.binding.dingding-description': 'বর্তমানে আনবাউন্ড ডিঙ্গটাল অ্যাকাউন্ট',
'app.settings.binding.bind': 'বাঁধাই',
'app.settings.notification.psw': 'অ্যাকাউন্টের পাসওয়ার্ড',
'app.settings.notification.psw-description':
'app.settings.notification.pwd': 'অ্যাকাউন্টের পাসওয়ার্ড',
'app.settings.notification.pwd-description':
'অন্যান্য ব্যবহারকারীর বার্তাগুলি স্টেশন চিঠি আকারে জানানো হবে',
'app.settings.notification.messages': 'সিস্টেম বার্তা',
'app.settings.notification.messages-description':

@ -2,13 +2,13 @@ export default {
'pages.layouts.userLayout.title':
'Ant Design is the most influential web design specification in Xihu district',
'pages.login.accountLogin.tab': 'Account Login',
'pages.login.accountLogin.errorMessage': 'Incorrect username/psw(admin/ant.design)',
'pages.login.accountLogin.errorMessage': 'Incorrect username/pwd(admin/ant.design)',
'pages.login.failure': 'Login failed, please try again!',
'pages.login.success': 'Login successful!',
'pages.login.username.placeholder': 'Username: admin or user',
'pages.login.username.required': 'Please input your username!',
'pages.login.psw.placeholder': 'Password: ant.design',
'pages.login.psw.required': 'Please input your psw!',
'pages.login.pwd.placeholder': 'Password: ant.design',
'pages.login.pwd.required': 'Please input your pwd!',
'pages.login.phoneLogin.tab': 'Phone Login',
'pages.login.phoneLogin.errorMessage': 'Verification Code Error',
'pages.login.phoneNumber.placeholder': 'Phone Number',

@ -24,8 +24,8 @@ export default {
'app.settings.security.strong': 'Strong',
'app.settings.security.medium': 'Medium',
'app.settings.security.weak': 'Weak',
'app.settings.security.psw': 'Account Password',
'app.settings.security.psw-description': 'Current psw strength',
'app.settings.security.pwd': 'Account Password',
'app.settings.security.pwd-description': 'Current pwd strength',
'app.settings.security.phone': 'Security Phone',
'app.settings.security.phone-description': 'Bound phone',
'app.settings.security.question': 'Security Question',
@ -46,8 +46,8 @@ export default {
'app.settings.binding.dingding': 'Binding DingTalk',
'app.settings.binding.dingding-description': 'Currently unbound DingTalk account',
'app.settings.binding.bind': 'Bind',
'app.settings.notification.psw': 'Account Password',
'app.settings.notification.psw-description':
'app.settings.notification.pwd': 'Account Password',
'app.settings.notification.pwd-description':
'Messages from other users will be notified in the form of a station letter',
'app.settings.notification.messages': 'System Messages',
'app.settings.notification.messages-description':

@ -6,8 +6,8 @@ export default {
'pages.login.success': 'ورود موفق!',
'pages.login.username.placeholder': 'نام کاربری: مدیر یا کاربر',
'pages.login.username.required': 'لطفا نام کاربری خود را وارد کنید!',
'pages.login.psw.placeholder': 'رمز عبور: ant.design',
'pages.login.psw.required': 'لطفاً رمز ورود خود را وارد کنید!',
'pages.login.pwd.placeholder': 'رمز عبور: ant.design',
'pages.login.pwd.required': 'لطفاً رمز ورود خود را وارد کنید!',
'pages.login.phoneLogin.tab': 'ورود به سیستم تلفن',
'pages.login.phoneLogin.errorMessage': 'خطای کد تأیید',
'pages.login.phoneNumber.placeholder': 'شماره تلفن',

@ -24,8 +24,8 @@ export default {
'app.settings.security.strong': 'قوی',
'app.settings.security.medium': 'متوسط',
'app.settings.security.weak': 'ضعیف',
'app.settings.security.psw': 'رمز عبور حساب کاربری',
'app.settings.security.psw-description': 'قدرت رمز عبور فعلی',
'app.settings.security.pwd': 'رمز عبور حساب کاربری',
'app.settings.security.pwd-description': 'قدرت رمز عبور فعلی',
'app.settings.security.phone': 'تلفن امنیتی',
'app.settings.security.phone-description': 'تلفن مقید',
'app.settings.security.question': 'سوال امنیتی',
@ -46,8 +46,8 @@ export default {
'app.settings.binding.dingding': 'اتصال DingTalk',
'app.settings.binding.dingding-description': 'حساب DingTalk در حال حاضر محدود نشده است',
'app.settings.binding.bind': 'بستن',
'app.settings.notification.psw': 'رمز عبور حساب کاربری',
'app.settings.notification.psw-description':
'app.settings.notification.pwd': 'رمز عبور حساب کاربری',
'app.settings.notification.pwd-description':
'پیام های سایر کاربران در قالب یک نامه ایستگاهی اعلام خواهد شد',
'app.settings.notification.messages': 'پیام های سیستم',
'app.settings.notification.messages-description':

@ -7,8 +7,8 @@ export default {
'pages.login.success': 'Login berhasil!',
'pages.login.username.placeholder': 'nama pengguna: admin atau user',
'pages.login.username.required': 'Nama pengguna harus diisi!',
'pages.login.psw.placeholder': 'kata sandi: ant.design',
'pages.login.psw.required': 'Kata sandi harus diisi!',
'pages.login.pwd.placeholder': 'kata sandi: ant.design',
'pages.login.pwd.required': 'Kata sandi harus diisi!',
'pages.login.phoneLogin.tab': 'Login dengan ponsel',
'pages.login.phoneLogin.errorMessage': 'Kesalahan kode verifikasi',
'pages.login.phoneNumber.placeholder': 'masukkan nomor telepon',

@ -24,8 +24,8 @@ export default {
'app.settings.security.strong': 'Kuat',
'app.settings.security.medium': 'Sedang',
'app.settings.security.weak': 'Lemah',
'app.settings.security.psw': 'Kata Sandi Akun',
'app.settings.security.psw-description': 'Kekuatan Kata Sandi saat ini',
'app.settings.security.pwd': 'Kata Sandi Akun',
'app.settings.security.pwd-description': 'Kekuatan Kata Sandi saat ini',
'app.settings.security.phone': 'Keamanan Ponsel',
'app.settings.security.phone-description': 'Mengikat Ponsel',
'app.settings.security.question': 'Pertanyaan Keamanan',
@ -46,8 +46,8 @@ export default {
'app.settings.binding.dingding': 'Mengikat DingTalk',
'app.settings.binding.dingding-description': 'Tidak mengikat akun DingTalk',
'app.settings.binding.bind': 'Ikat',
'app.settings.notification.psw': 'Kata Sandi Akun',
'app.settings.notification.psw-description':
'app.settings.notification.pwd': 'Kata Sandi Akun',
'app.settings.notification.pwd-description':
'Pesan dari pengguna lain akan diberitahu dalam bentuk surat',
'app.settings.notification.messages': 'Pesan Sistem',
'app.settings.notification.messages-description':

@ -7,8 +7,8 @@ export default {
'pages.login.success': 'ログイン成功!',
'pages.login.username.placeholder': 'ユーザー名adminまたはuser',
'pages.login.username.required': 'ユーザー名を入力してください!',
'pages.login.psw.placeholder': 'パスワードant.design',
'pages.login.psw.required': 'パスワードを入力してください!',
'pages.login.pwd.placeholder': 'パスワードant.design',
'pages.login.pwd.required': 'パスワードを入力してください!',
'pages.login.phoneLogin.tab': '電話ログイン',
'pages.login.phoneLogin.errorMessage': '検証コードエラー',
'pages.login.phoneNumber.placeholder': '電話番号',

@ -24,8 +24,8 @@ export default {
'app.settings.security.strong': '強い',
'app.settings.security.medium': 'ミディアム',
'app.settings.security.weak': '弱い',
'app.settings.security.psw': 'アカウントパスワード',
'app.settings.security.psw-description': '現在のパスワードの強度',
'app.settings.security.pwd': 'アカウントパスワード',
'app.settings.security.pwd-description': '現在のパスワードの強度',
'app.settings.security.phone': 'セキュリティ電話番号',
'app.settings.security.phone-description': 'バインドされた電話番号',
'app.settings.security.question': '秘密の質問',
@ -46,8 +46,8 @@ export default {
'app.settings.binding.dingding': 'ディントークをバインドする',
'app.settings.binding.dingding-description': '現在バインドされていないディントークアカウント',
'app.settings.binding.bind': 'バインド',
'app.settings.notification.psw': 'アカウントパスワード',
'app.settings.notification.psw-description':
'app.settings.notification.pwd': 'アカウントパスワード',
'app.settings.notification.pwd-description':
'他のユーザーからのメッセージは、ステーションレターの形式で通知されます',
'app.settings.notification.messages': 'システムメッセージ',
'app.settings.notification.messages-description':

@ -7,8 +7,8 @@ export default {
'pages.login.success': 'Login efetuado com sucesso!',
'pages.login.username.placeholder': 'Usuário: admin or user',
'pages.login.username.required': 'Por favor insira seu usuário!',
'pages.login.psw.placeholder': 'Senha: ant.design',
'pages.login.psw.required': 'Por favor insira sua senha!',
'pages.login.pwd.placeholder': 'Senha: ant.design',
'pages.login.pwd.required': 'Por favor insira sua senha!',
'pages.login.phoneLogin.tab': 'Login com Telefone',
'pages.login.phoneLogin.errorMessage': 'Erro de Código de Verificação',
'pages.login.phoneNumber.placeholder': 'Telefone',

@ -24,8 +24,8 @@ export default {
'app.settings.security.strong': 'Forte',
'app.settings.security.medium': 'Média',
'app.settings.security.weak': 'Fraca',
'app.settings.security.psw': 'Senha da Conta',
'app.settings.security.psw-description': 'Força da senha',
'app.settings.security.pwd': 'Senha da Conta',
'app.settings.security.pwd-description': 'Força da senha',
'app.settings.security.phone': 'Telefone de Seguraça',
'app.settings.security.phone-description': 'Telefone vinculado',
'app.settings.security.question': 'Pergunta de Segurança',
@ -46,8 +46,8 @@ export default {
'app.settings.binding.dingding': 'Vincular DingTalk',
'app.settings.binding.dingding-description': 'Atualmente não vinculado à conta DingTalk',
'app.settings.binding.bind': 'Vincular',
'app.settings.notification.psw': 'Senha da Conta',
'app.settings.notification.psw-description':
'app.settings.notification.pwd': 'Senha da Conta',
'app.settings.notification.pwd-description':
'Mensagens de outros usuários serão notificadas na forma de uma estação de letra',
'app.settings.notification.messages': 'Mensagens de Sistema',
'app.settings.notification.messages-description':

@ -38,10 +38,12 @@ export default {
...common,
...Object.assign(
{},
...Object.values(businessProject),
...Object.values(model),
// 待启用
...Object.values(systems),
...Object.values(alarms),
...Object.values(devices),
...Object.values(businessProject),
...Object.values(model),
),
};

@ -2,7 +2,7 @@
* @Author: donghao donghao@supervision.ltd
* @Date: 2024-04-09 15:08:13
* @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2024-04-15 11:24:07
* @LastEditTime: 2024-04-24 16:46:08
* @FilePath: \general-ai-manage\src\locales\zh-CN\businessProject.ts
* @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
@ -28,3 +28,9 @@ export const business_project_list: { [key: string]: string } = {
'business.list.table.form.logo': '企业logo',
'business.list.table.form.rule.required.logo': '请上传企业logo',
};
// 企业信息主页
export const business_info_index: { [key: string]: string } = {
'business_info.list.table.form.name': '企业账号',
'business_info.list.table.form.pwd': '密码',
};

@ -84,7 +84,7 @@ export const interface_manage: { [key: string]: string } = {
'device.interface_manage.table.list.capture': '最近拍摄',
'device.interface_manage.table.list.port': '端口',
'device.interface_manage.table.list.loginName': '登录名',
'device.interface_manage.table.list.psw': '密码',
'device.interface_manage.table.list.pwd': '密码',
'device.interface_manage.table.list.fileDirectory': '文件目录',
'device.interface_manage.table.list.requestAddress': '请求地址',
'device.interface_manage.table.list.requestKey': '请求Key',
@ -100,7 +100,7 @@ export const interface_manage: { [key: string]: string } = {
'device.interface_manage.table.rule.required.address': '接口地址为必填项',
'device.interface_manage.table.rule.required.ip': 'IP地址为必填项',
'device.interface_manage.table.rule.required.loginName': '登录名为必填项',
'device.interface_manage.table.rule.required.psw': '密码为必填项',
'device.interface_manage.table.rule.required.pwd': '密码为必填项',
'device.interface_manage.table.rule.required.fileDirectory': '文件目录为必填项',
'device.interface_manage.table.rule.required.requestAddress': '请求地址为必填项',
'device.interface_manage.table.rule.required.requestKey': '请求Key为必填项',

@ -2,7 +2,7 @@
* @Author: donghao donghao@supervision.ltd
* @Date: 2024-04-01 11:20:09
* @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2024-04-22 15:42:18
* @LastEditTime: 2024-04-23 10:51:24
* @FilePath: \uighur-recognition-web2\src\locales\zh-CN\menu.ts
* @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
@ -62,10 +62,10 @@ export default {
'menu.home-business-project': '企业项目',
'menu.model-index': '模型管理',
'menu.model-runtime-lib': '模型运行库',
'menu-business-info-index': '企业信息',
'menu-business-node-setting': '节点设置',
'menu-business-model-index': '业务模型',
'menu.business-info-index': '企业信息',
'menu.business-node-setting': '节点设置',
'menu.business-model-index': '业务模型',
// 待废弃
'menu.realTime': '实时分析',
'menu.realTime.realTime-involved-list': '告警汇总',

@ -132,7 +132,7 @@ export const server_status: { [key: string]: string } = {
'resource.server_status.table.list.name': '服务器名称',
'resource.server_status.table.list.userName': '用户名',
'resource.server_status.table.list.ip': 'IP',
'resource.server_status.table.list.psw': '密码',
'resource.server_status.table.list.pwd': '密码',
'resource.server_status.table.list.defaultPort': '默认端口',
'resource.server_status.table.list.parameter': '服务器参数',
'resource.server_status.table.list.publicKeyString': '公钥字符串',

@ -14,8 +14,8 @@ export default {
'pages.login.success': '登录成功!',
'pages.login.username.placeholder': '用户名: admin or user',
'pages.login.username.required': '用户名是必填项!',
'pages.login.psw.placeholder': '密码: ant.design',
'pages.login.psw.required': '密码是必填项!',
'pages.login.pwd.placeholder': '密码: ant.design',
'pages.login.pwd.required': '密码是必填项!',
'pages.login.phoneLogin.tab': '手机号登录',
'pages.login.phoneLogin.errorMessage': '验证码错误',
'pages.login.phoneNumber.placeholder': '请输入手机号!',

@ -24,8 +24,8 @@ export default {
'app.settings.security.strong': '强',
'app.settings.security.medium': '中',
'app.settings.security.weak': '弱',
'app.settings.security.psw': '账户密码',
'app.settings.security.psw-description': '当前密码强度',
'app.settings.security.pwd': '账户密码',
'app.settings.security.pwd-description': '当前密码强度',
'app.settings.security.phone': '密保手机',
'app.settings.security.phone-description': '已绑定手机',
'app.settings.security.question': '密保问题',
@ -44,8 +44,8 @@ export default {
'app.settings.binding.dingding': '绑定钉钉',
'app.settings.binding.dingding-description': '当前未绑定钉钉账号',
'app.settings.binding.bind': '绑定',
'app.settings.notification.psw': '账户密码',
'app.settings.notification.psw-description': '其他用户的消息将以站内信的形式通知',
'app.settings.notification.pwd': '账户密码',
'app.settings.notification.pwd-description': '其他用户的消息将以站内信的形式通知',
'app.settings.notification.messages': '系统消息',
'app.settings.notification.messages-description': '系统消息将以站内信的形式通知',
'app.settings.notification.todo': '待办任务',

@ -82,7 +82,7 @@ export const user: { [key: string]: string } = {
'system.user.table.list.id': 'ID',
'system.user.table.list.userName': '用户名',
'system.user.table.list.nickName': '昵称',
'system.user.table.list.psw': '密码',
'system.user.table.list.pwd': '密码',
'system.user.table.list.password_re': '再一次确认密码',
'system.user.table.list.roleId': '角色',
'system.user.table.list.roleIds': '角色',
@ -100,8 +100,8 @@ export const user: { [key: string]: string } = {
'system.user.table.list.update': '更新用户',
'system.user.table.rule.required.userName': '用户名为必填项',
'system.user.table.rule.required.nickName': '昵称为必填项',
'system.user.table.rule.required.psw': '密码为必填项',
'system.user.table.rule.psw.not_same': '两次密码不一致',
'system.user.table.rule.required.pwd': '密码为必填项',
'system.user.table.rule.pwd.not_same': '两次密码不一致',
};
export const post: { [key: string]: string } = {

@ -6,8 +6,8 @@ export default {
'pages.login.success': '登錄成功!',
'pages.login.username.placeholder': '用戶名: admin or user',
'pages.login.username.required': '用戶名是必填項!',
'pages.login.psw.placeholder': '密碼: ant.design',
'pages.login.psw.required': '密碼是必填項!',
'pages.login.pwd.placeholder': '密碼: ant.design',
'pages.login.pwd.required': '密碼是必填項!',
'pages.login.phoneLogin.tab': '手機號登錄',
'pages.login.phoneLogin.errorMessage': '驗證碼錯誤',
'pages.login.phoneNumber.placeholder': '請輸入手機號!',

@ -24,8 +24,8 @@ export default {
'app.settings.security.strong': '強',
'app.settings.security.medium': '中',
'app.settings.security.weak': '弱',
'app.settings.security.psw': '賬戶密碼',
'app.settings.security.psw-description': '當前密碼強度',
'app.settings.security.pwd': '賬戶密碼',
'app.settings.security.pwd-description': '當前密碼強度',
'app.settings.security.phone': '密保手機',
'app.settings.security.phone-description': '已綁定手機',
'app.settings.security.question': '密保問題',
@ -44,8 +44,8 @@ export default {
'app.settings.binding.dingding': '綁定釘釘',
'app.settings.binding.dingding-description': '當前未綁定釘釘賬號',
'app.settings.binding.bind': '綁定',
'app.settings.notification.psw': '賬戶密碼',
'app.settings.notification.psw-description': '其他用戶的消息將以站內信的形式通知',
'app.settings.notification.pwd': '賬戶密碼',
'app.settings.notification.pwd-description': '其他用戶的消息將以站內信的形式通知',
'app.settings.notification.messages': '系統消息',
'app.settings.notification.messages-description': '系統消息將以站內信的形式通知',
'app.settings.notification.todo': '待辦任務',

@ -212,7 +212,7 @@ const ModelDetail: React.FC = () => {
bodyStyle={{ padding: 0, margin: 0, backgroundColor: 'transparent' }}
>
<InnerPageBack title=""></InnerPageBack>
<div className="gn_table_descriptions">
<div className="gn_table_descriptions mb-[20px]">
<ProDescriptions
column={3}
columns={ModelDetailColumns}

@ -1,84 +0,0 @@
.alarmImgBox {
// display: flex;
// justify-content: flex-start;
.alarmImgLeft {
position: relative;
width: 120px;
margin-right: 32px;
// height: 600px;
.alarmImgLeftBox {
width: 112px;
height: 112px;
border-radius: 4px;
// background: skyblue;
}
.alarmImgLeftBoxActive {
width: 112px;
height: 112px;
border: 1.5px solid #081fa8;
border-radius: 4px;
}
.shadowBox {
position: absolute;
bottom: 0px;
left: 0;
z-index: 999;
width: 112px;
height: 20px;
background: #fff;
}
}
.alarmImgRight {
position: relative;
flex: 1;
.alarmImgRightTopBox {
width: 640px;
height: 640px;
background: skyblue;
}
.alarmDetails {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 38px;
margin-bottom: 16px;
padding-left: 24px;
color: #ffffff;
font-weight: 400;
font-size: 16px;
font-family: PingFang SC;
line-height: 38px;
background: rgba(0, 0, 0, 0.6);
.alarmSpan {
// color: #333;
margin-right: 24px;
}
}
}
.alarmImgDescribe {
margin-bottom: 12px;
color: #666;
font-weight: 500;
font-size: 16px;
font-family: PingFang SC;
span {
color: #333;
}
}
.alarmImgContent {
display: flex;
justify-content: center;
box-sizing: border-box;
width: 784px;
margin-bottom: 24px;
padding: 16px;
// height: 172px;
background: #f7f7f7;
border: 1px dashed #dcdcdc;
border-radius: 4px;
}
}
.myButtonDisabled {
visibility: hidden;
}

@ -1,293 +0,0 @@
import { postIgnoringvents } from '@/services/realTime/alarmlist';
import { postRecognition } from '@/services/realTime/involved';
import { ModalForm } from '@ant-design/pro-components';
import { useIntl } from '@umijs/max';
import { Button, Form, message } from 'antd';
import React, { useEffect, useState } from 'react';
// Import Swiper React components
// import { Swiper, SwiperSlide } from 'swiper/react';
// import { Navigation, Pagination, Mousewheel } from 'swiper/modules';
// Import Swiper styles
// import 'swiper/css';
// import 'swiper/css/navigation';
// import 'swiper/css/pagination';
import moment from 'moment';
import styles from './AlarmDetails.less';
import ImageSinglePopover from './ImageSinglePopover';
import ImageWithPopover from './ImageWithPopover';
export type FormValueType = {
target?: string;
template?: string;
type?: string;
time?: string;
frequency?: string;
} & Partial<API.AlarmDetailsParams>;
export type UpdateFormProps = {
updateModalOpen: boolean;
handleModal: () => void;
values: Partial<API.AlarmDetailsParams>;
reload: any;
};
const UpdateForm: React.FC<UpdateFormProps> = (props) => {
const intl = useIntl();
const [form] = Form.useForm<API.AlarmDetailsParams>();
// const [isActive, setIsActive] = useState(0);
// const [imageSrc, setImageSrc] = useState('');
// const [visible, setVisible] = useState(false);
const [involved, setInvolved] = useState(0);
// const [involvedInfo, setInvolvedInfo] = useState([...(props?.values?.person_list || [])]);
const [involvedInfo, setInvolvedInfo] = useState<any[]>([]);
useEffect(() => {
if (props.values?.person_list) {
setInvolvedInfo([...props.values.person_list]);
}
}, [props.values?.person_list]);
useEffect(() => {
if (props.values?.person_classify) {
setInvolved(props.values.person_classify);
console.log(involved);
}
}, [props.values?.person_classify]);
const handlePostRecognition = (person_id: any, classify: any) => {
postRecognition({
person_id: person_id,
classify: classify,
})
.then((res) => {
console.log(res.data.classify, 'res.data.classify');
if (res.data.classify === 1) {
message.success('此人已被设为重点关注');
} else {
message.success('此人已被移除重点关注');
}
props.reload();
})
.catch(() => {
message.error(intl.formatMessage({ id: 'common.failure', defaultMessage: '失败' }));
});
};
/** 多人告警组件 */
const handleInvolved = (value: any, index: any) => {
const updatedInvolvedInfo = [...involvedInfo];
console.log(updatedInvolvedInfo);
updatedInvolvedInfo[index][2] = value;
setInvolvedInfo(updatedInvolvedInfo);
handlePostRecognition(updatedInvolvedInfo[index][0], value);
};
/** 单人告警组件 */
// const handleSingleInvolved = () => {
// if (involved === 1) {
// setInvolved(0);
// handlePostRecognition(props.values?.person_id, 0)
// } else {
// setInvolved(1);
// handlePostRecognition(props.values?.person_id, 1)
// }
// }
// const [open, setOpen] = useState(false);
// useEffect(() => {
// // console.log(Array.isArray(props.values?.person_id),'Array.isArray(props.values?.person_id)');
// setImageSrc(props?.values?.picture_path?.[0]);
// }, [props.updateModalOpen]);
return (
<ModalForm<any>
width={832}
title={`${props.values.warning_name}告警`}
open={props.updateModalOpen}
form={form}
autoFocusFirstInput
modalProps={{
destroyOnClose: true,
onCancel: () => {
setInvolved(0);
props.handleModal();
},
okText: intl.formatMessage({ id: 'common.yes', defaultMessage: '确认' }),
cancelText: intl.formatMessage({ id: 'common.no', defaultMessage: '取消' }),
}}
submitter={{
// resetButtonProps: {
// style: {
// display: 'none',
// },
// },
// searchConfig: {
// submitText: '忽略此事件',
// },
render: (prop) => {
return [
<Button
key="ok"
style={{ backgroundColor: '#E80D0D', color: '#FFF', borderBlockColor: '#E80D0D' }}
onClick={() => {
prop.submit();
}}
>
</Button>,
props.values?.person_list ? null : (
<Button
key="involved"
style={{ backgroundColor: '#FAAD14', color: '#FFF', borderBlockColor: '#FAAD14' }}
onClick={() => {
// console.log(props.updateModalOpen);
setInvolved(1);
handlePostRecognition(props.values?.person_id, 1);
}}
>
</Button>
),
props.values?.person_list ? null : (
<Button
key="noInvolved"
style={{ background: '#FFF', color: '#E80D0D', borderColor: '#E80D0D' }}
onClick={() => {
// console.log(props.updateModalOpen);
setInvolved(0);
handlePostRecognition(props.values?.person_id, 0);
}}
>
</Button>
),
];
},
}}
submitTimeout={2000}
onFinish={async (values) => {
values.is_ignore = true;
values.person_id = props.values.person_id;
// console.log(values);
postIgnoringvents(values)
.then(() => {
message.success(intl.formatMessage({ id: 'common.success', defaultMessage: '成功' }));
props.reload();
})
.catch(() => {
message.error(intl.formatMessage({ id: 'common.failure', defaultMessage: '失败' }));
});
props.handleModal();
return true;
}}
>
{/* <ProForm.Group> */}
<div className={styles.alarmImgBox}>
<div className={styles.alarmImgDescribe}>
: <span>{props.values.device_name}</span>
</div>
<div className={styles.alarmImgDescribe}>
:{' '}
<span className={styles.alarmSpan}>
{moment(props.values.trigger_time).format('YYYY-MM-DD hh:mm:ss')}
</span>
</div>
<div className={styles.alarmImgContent}>
{Array.isArray(props.values?.person_id)
? Array.isArray(involvedInfo) && involvedInfo.length
? involvedInfo.map((item: any, index: any) => {
return (
<ImageWithPopover
src={item?.[1]}
involved={involvedInfo[index][2]}
key={index}
indexId={index}
handleInvolved={handleInvolved}
time={props.values.trigger_time}
></ImageWithPopover>
);
})
: Array.isArray(props?.values?.picture_path) && props?.values?.picture_path.length
? props.values.picture_path.map((item: any, index: any) => {
return (
<ImageSinglePopover
src={item}
involved={involved}
key={index}
// handleInvolved={handleSingleInvolved}
reload={props.reload} // 将reload方法作为prop传递给ImageSinglePopover组件
time={props.values.trigger_time}
></ImageSinglePopover>
);
})
: null
: Array.isArray(props?.values?.picture_path) && props?.values?.picture_path.length
? props.values.picture_path.map((item: any, index: any) => {
return (
<ImageSinglePopover
src={item}
involved={involved}
key={index}
// handleInvolved={handleSingleInvolved}
reload={props.reload} // 将reload方法作为prop传递给ImageSinglePopover组件
time={props.values.trigger_time}
></ImageSinglePopover>
);
})
: null}
{/* { Array.isArray(involvedInfo) && involvedInfo.length && involvedInfo.map((item: any, index: any) => {
console.log(involvedInfo,'item');
return(<ImageWithPopover src={item?.[1]} involved={involvedInfo[index][2]} key={index} indexId={index} handleInvolved={handleInvolved}></ImageWithPopover>)
})} */}
</div>
{/* <div className={styles.alarmImgLeft}>
<Swiper
style={{height:660}}
slidesPerView={5}
spaceBetween={20}
direction='vertical'
mousewheel={true}
modules={[Mousewheel]}
onSlideChange={() => {
console.log(111);
}}
// pagination={{
// clickable: true,
// }}
// modules={[Pagination]}
>
{ Array.isArray(props?.values?.picture_path) && props?.values?.picture_path.length && props?.values?.picture_path.map((item: any, index: any) => {
return (<SwiperSlide key={index} virtualIndex={index} onClick={() => {
console.log(index);
setIsActive(index)
setImageSrc(item)
}}>
<div className={ styles.alarmImgLeftBox }>
<Image
style={{
width: 112,
height: 112,
borderRadius: 4
}}
className={ index === isActive ? styles.alarmImgLeftBoxActive : '' }
preview={false}
src={item}
/>
</div>
</SwiperSlide>)
})}
</Swiper>
<div className={styles.shadowBox}></div>
</div>
<div className={styles.alarmImgRight}>
<div className={styles.alarmImgRightTopBox}>
<Image
width={640}
height={640}
preview={false}
src={imageSrc}
/>
</div>
<div className={styles.alarmDetails}>
: <span className={styles.alarmSpan}>{props.values.device_name}</span>: <span className={styles.alarmSpan}>{moment(props.values.trigger_time).format('YYYY-MM-DD hh:mm:ss')}</span>
</div>
</div> */}
</div>
{/* </ProForm.Group> */}
</ModalForm>
);
};
export default UpdateForm;

@ -1,147 +0,0 @@
import { EyeOutlined } from '@ant-design/icons';
import { Image } from 'antd';
import moment from 'moment';
import React, { useState } from 'react';
interface ImageSinglePopoverProps {
src: string;
involved: any;
// handleInvolved: () => void;
reload: any;
time: any;
}
const ImageSinglePopover: React.FC<ImageSinglePopoverProps> = ({ src, involved, time }) => {
const [visible, setVisible] = useState(false);
// const [open, setOpen] = useState(false);
// 定义一个方法,用于生成自定义的遮罩层
const generateMask = (text: any) => (
<div
style={{
position: 'absolute',
top: 0,
left: 0,
width: '100%',
height: '100%',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
color: '#fff',
}}
>
<div style={{ display: 'flex', alignItems: 'center', fontSize: 12 }}>
<EyeOutlined style={{ marginRight: 8, fontSize: 12 }} />
<div>{text}</div>
</div>
</div>
);
// const content = (
// <div style={{ display: 'flex', flexDirection: 'column', justifyContent: 'center',alignItems: 'center', height: 56}}>
// {/* <div>选项1</div>
// <div>选项2</div> */}
// <Button
// type="text"
// style={{ height:22, padding: 0,fontSize: 12,color: '#FFF' }}
// icon={<InfoCircleOutlined style={{ color: '#FAAD14',fontSize: 12}} />}
// onClick={()=>{
// // setInvolved(true)
// // handleInvolved();
// // reload()
// setOpen(false)
// }}
// >加入重点关注</Button>
// <Button
// type="text"
// style={{ height:22, padding: 0,fontSize: 12,color: '#FFF' }}
// icon={<CloseCircleOutlined style={{ color: '#E80D0D',fontSize: 12}} />}
// onClick={()=>{
// // setInvolved(false)
// // handleInvolved();
// // reload()
// setOpen(false)
// }}
// >移除重点关注</Button>
// </div>
// );
const handleVisibleChange = (value: boolean) => {
setVisible(value);
};
// const handleOpenChange = (value: boolean) => {
// setOpen(value);
// };
return (
<div
style={{
position: 'relative',
boxSizing: 'border-box',
width: 140,
height: 160,
marginRight: 12,
}}
>
<Image
style={{ borderRadius: 4 }}
width={140}
height={140}
preview={{
visible,
src,
onVisibleChange: handleVisibleChange,
mask: generateMask('点击可预览大图'),
}}
src={src}
/>
<div
style={{
height: 30,
textAlign: 'center',
lineHeight: '30px',
fontWeight: 500,
color: '#333',
}}
>
{moment(time).format('YYYY-MM-DD hh:mm:ss')}
</div>
{/* <Popover
placement="right"
content={content}
trigger="click"
style={{ width: 104, height: 64 }}
color="rgba(0, 0, 0, 0.6)"
overlayInnerStyle={{ width: 104, height: 64, padding: 4, borderRadius: 2 }}
open={open}
onOpenChange={handleOpenChange}
>
<Button
style={{ position: 'absolute', bottom: 8, right: 0 }}
type="text"
icon={<EllipsisOutlined style={{ color: '#fff', fontSize: 24, transform: 'rotate(90deg)' }} />}
/>
</Popover> */}
{involved === 1 && (
<div
style={{
position: 'absolute',
top: 0,
right: 0,
width: 64,
height: 24,
background: '#FAAD14',
borderRadius: '0px 4px 0px 4px',
color: '#FFF',
fontSize: 12,
textAlign: 'center',
lineHeight: '24px',
}}
>
</div>
)}
</div>
);
};
export default ImageSinglePopover;

@ -1,170 +0,0 @@
import {
CloseCircleOutlined,
EllipsisOutlined,
EyeOutlined,
InfoCircleOutlined,
} from '@ant-design/icons';
import { Button, Image, Popover } from 'antd';
import moment from 'moment';
import React, { useState } from 'react';
interface ImageWithPopoverProps {
src: string;
involved: any;
indexId: any;
handleInvolved: (value: any, index: any) => void;
time: any;
}
const ImageWithPopover: React.FC<ImageWithPopoverProps> = ({
src,
involved,
indexId,
handleInvolved,
time,
}) => {
const [visible, setVisible] = useState(false);
const [open, setOpen] = useState(false);
// 定义一个方法,用于生成自定义的遮罩层
const generateMask = (text: any) => (
<div
style={{
position: 'absolute',
top: 0,
left: 0,
width: '100%',
height: '100%',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
color: '#fff',
}}
>
<div style={{ display: 'flex', alignItems: 'center', fontSize: 12 }}>
<EyeOutlined style={{ marginRight: 8, fontSize: 12 }} />
<div>{text}</div>
</div>
</div>
);
const content = (
<div
style={{
display: 'flex',
flexDirection: 'column',
justifyContent: 'center',
alignItems: 'center',
height: 56,
}}
>
{/* <div>1</div>
<div>2</div> */}
<Button
type="text"
style={{ height: 22, padding: 0, fontSize: 12, color: '#FFF', marginBottom: 4 }}
icon={<InfoCircleOutlined style={{ color: '#FAAD14', fontSize: 12 }} />}
onClick={() => {
// setInvolved(true)
handleInvolved(1, indexId);
setOpen(false);
}}
>
</Button>
<Button
type="text"
style={{ height: 22, padding: 0, fontSize: 12, color: '#FFF' }}
icon={<CloseCircleOutlined style={{ color: '#E80D0D', fontSize: 12 }} />}
onClick={() => {
// setInvolved(false)
handleInvolved(0, indexId);
setOpen(false);
}}
>
</Button>
</div>
);
const handleVisibleChange = (value: boolean) => {
setVisible(value);
};
const handleOpenChange = (value: boolean) => {
setOpen(value);
};
return (
<div
style={{
position: 'relative',
boxSizing: 'border-box',
width: 140,
height: 160,
marginRight: 12,
}}
>
<Image
style={{ borderRadius: 4 }}
width={140}
height={140}
preview={{
visible,
src,
onVisibleChange: handleVisibleChange,
mask: generateMask('点击可预览大图'),
}}
src={src}
/>
<Popover
placement="right"
content={content}
trigger="click"
style={{ width: 104, height: 64 }}
color="rgba(0, 0, 0, 0.6)"
overlayInnerStyle={{ width: 104, height: 68, padding: 4, borderRadius: 2 }}
open={open}
onOpenChange={handleOpenChange}
>
<Button
style={{ position: 'absolute', bottom: 20, right: 0 }}
type="text"
icon={
<EllipsisOutlined style={{ color: '#fff', fontSize: 24, transform: 'rotate(90deg)' }} />
}
/>
</Popover>
<div
style={{
height: 30,
textAlign: 'center',
lineHeight: '30px',
fontWeight: 500,
color: '#333',
}}
>
{moment(time).format('YYYY-MM-DD hh:mm:ss')}
</div>
{involved === 1 && (
<div
style={{
position: 'absolute',
top: 0,
right: 0,
width: 64,
height: 24,
background: '#FAAD14',
borderRadius: '0px 4px 0px 4px',
color: '#FFF',
fontSize: 12,
textAlign: 'center',
lineHeight: '24px',
}}
>
</div>
)}
</div>
);
};
export default ImageWithPopover;

@ -0,0 +1,64 @@
/*
* @Author: donghao donghao@supervision.ltd
* @Date: 2024-04-23 17:46:47
* @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2024-04-24 16:46:44
* @FilePath: \general-ai-platform-web\src\pages\Project\BusinessInfo\components\accountPsw.tsx
* @Description:
*/
import { ProForm, ProFormText } from '@ant-design/pro-components';
import { FormattedMessage, useIntl } from '@umijs/max';
import React from 'react';
type AccountPswProps = {
info: Record<string, any>;
};
const AccountPsw: React.FC<AccountPswProps> = () => {
const [form] = ProForm.useForm(); // form 对象
const intl = useIntl();
return (
<ProForm
className="gn_form"
form={form}
submitter={{
submitButtonProps: {
style: {
display: 'none', // 设置为隐藏状态
},
},
resetButtonProps: {
style: {
display: 'none', // 设置为隐藏状态
},
},
}}
>
<ProForm.Group>
<ProFormText
width="34.45vw"
name="name"
label={
<FormattedMessage id="business_info.list.table.form.name" defaultMessage="企业账号" />
}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'business.list.table.form.name',
defaultMessage: '$$$',
})}`}
required={true}
/>
<ProFormText.Password
width="34.45vw"
label={<FormattedMessage id="business_info.list.table.form.pwd" defaultMessage="密码" />}
name="pwd"
placeholder={'输入新密码'}
/>
</ProForm.Group>
</ProForm>
);
};
export default AccountPsw;

@ -0,0 +1,79 @@
/*
* @Author: donghao donghao@supervision.ltd
* @Date: 2024-04-08 16:57:30
* @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2024-04-24 16:58:44
* @FilePath: \general-ai-manage\src\pages\Project\BusinessProject\components\businessCard.tsx
* @Description:
*/
import { ProCard } from '@ant-design/pro-components';
import { Image, theme } from 'antd';
import icon1 from '/public/images/bussnessInfo/icon1.png';
import svg1 from '/public/images/bussnessInfo/model_1.png';
import icon2 from '/public/images/bussnessInfo/icon2.png';
type AlgorithmCardProps = {
info: Record<string, any>;
};
const AlgorithmCard: React.FC<AlgorithmCardProps> = ({ info }) => {
const { token } = theme.useToken();
console.log(theme, 'AlgorithmCard_token', theme.useToken());
return (
<ProCard
className="algorithmCard_box"
style={{
backgroundColor: '#F5F6FF',
margin: 0,
padding: 0,
borderRadius: 4,
boxShadow: 'inset 2px 2px 4px 0px #D8E8FF, inset -2px -2px 4px 0px #D8E8FF',
border: '1px solid #FFFFFF',
}}
bodyStyle={{ margin: 0, padding: 0 }}
>
<div className="flex justify-between px-[16px] py-[20px]">
<div>
<div className="flex items-center mb-[12px] ">
<span
className="pr-[16px] head5 "
style={{
color: token.colorPrimary,
}}
>
{info.name}
</span>
<span
className="tag_type"
style={{
background:
info.typeName === '深度学习'
? 'linear-gradient( 180deg, #FFB21A 0%, #FF9B3E 100%)'
: 'linear-gradient(180deg, #21c7ff 0%, #428cff 100%)',
}}
>
{info.typeName}
</span>
</div>
<ul className="p1">
<li className="flex items-center mb-[8px]">
<Image width={16} className="flex items-center" preview={false} src={icon1} />
<span className="pl-[8px]"> </span>
<span className="color_1">{info.version}</span>
</li>
<li className="flex items-center">
<Image width={16} className="flex items-center" preview={false} src={icon2} />
<span className="pl-[8px]"> </span>
<span className="color_1">{info.industryName}</span>
</li>
</ul>
</div>
<Image width={64} preview={false} src={svg1} />
</div>
</ProCard>
);
};
export default AlgorithmCard;

@ -0,0 +1,54 @@
/*
* @Author: donghao donghao@supervision.ltd
* @Date: 2024-04-23 17:00:00
* @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2024-04-24 17:14:48
* @FilePath: \general-ai-platform-web\src\pages\Project\BusinessInfo\components\baseInfo.tsx
* @Description:
*
*/
import { ProDescriptions } from '@ant-design/pro-components';
import { FormattedMessage } from '@umijs/max';
type BaseInfoProps = {
info: Record<string, any>;
};
const BaseInfo: React.FC<BaseInfoProps> = ({ info }) => {
// 模型基本信息
const ModelDetailColumns = [
{
title: <FormattedMessage id="business.list.table.form.address" defaultMessage="公司地址" />,
dataIndex: 'address',
render: (_, record) => {
return record?.province + record?.city + record.address;
},
},
{
title: <FormattedMessage id="business.list.table.form.industry" defaultMessage="所属行业" />,
dataIndex: 'industryName',
},
{
title: <FormattedMessage id="business.list.table.form.contacts" defaultMessage="联系人" />,
dataIndex: 'contacts',
},
{
title: (
<FormattedMessage id="business.list.table.form.contactWay" defaultMessage="联系方式" />
),
dataIndex: 'contactWay',
},
{
title: <FormattedMessage id="business.list.table.form.remark" defaultMessage="公司简介" />,
dataIndex: 'remark',
},
];
return (
<div className="gn_table_descriptions bg_active_1">
<ProDescriptions column={4} columns={ModelDetailColumns} dataSource={info}></ProDescriptions>
</div>
);
};
export default BaseInfo;

@ -0,0 +1,350 @@
/*
* @Author: donghao donghao@supervision.ltd
* @Date: 2024-04-23 17:46:28
* @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2024-04-24 15:00:31
* @FilePath: \general-ai-platform-web\src\pages\Project\BusinessInfo\components\updateForm.tsx
* @Description:
*/
import { useCity } from '@/hooks/useCity';
import { beforeUploadImage } from '@/utils/common';
import {
ModalForm,
ProForm,
ProFormSelect,
ProFormText,
ProFormTextArea,
// ProFormDependency,
ProFormUploadButton,
} from '@ant-design/pro-components';
import { FormattedMessage, useIntl } from '@umijs/max';
import { Form } from 'antd';
import React, { useState } from 'react';
import {
proFormSmallItemStyleProps,
proFormSmallModelWidth,
} from '../../../../../config/defaultForm';
// @ts-ignore
import cookie from 'react-cookies';
export type FormValueType = {
target?: string;
template?: string;
type?: string;
time?: string;
frequency?: string;
} & Partial<API.ModelCategory>;
export type UpdateFormProps = {
updateModalOpen: boolean;
handleModal: () => void;
values: Partial<API.ModelCategory>;
reload: any;
};
const UpdateForm: React.FC<UpdateFormProps> = (props) => {
const intl = useIntl();
// const [isAuto, setIsAuto] = useState(true);
const [form] = Form.useForm<API.ModelCategory>();
const [cityOptions, setCityOptions] = useState<Record<string, any>[]>([]);
const { formatProvinceByData, formatCityByProvinceData } = useCity();
function changeCity(record1, record2) {
// 汇总城市数据到表单
console.log(record1, record2, 'changeProvince_record');
}
return (
<ModalForm<API.ModelCategory>
className="gn_form"
width={proFormSmallModelWidth}
title={intl.formatMessage({
id: 'business.list.table.createForm.add',
defaultMessage: '新建',
})}
open={props.updateModalOpen}
form={form}
autoFocusFirstInput
modalProps={{
destroyOnClose: true,
onCancel: () => props.handleModal(),
}}
submitTimeout={2000}
onFinish={async (values) => {
console.log(values, 'add_finish_values');
// TODO 对接更新接口
// postModelCategoryCreateModelCategory(values)
// .then(() => {
// message.success(intl.formatMessage({ id: 'common.success', defaultMessage: '$$$' }));
// props.reload();
// })
// .catch(() => {
// message.error(intl.formatMessage({ id: 'common.failure', defaultMessage: '$$$' }));
// });
props.handleModal();
return true;
}}
>
<ProForm.Group>
<ProFormText
width={proFormSmallItemStyleProps.width}
name="name"
label={<FormattedMessage id="business.list.table.form.name" defaultMessage="名称" />}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'business.list.table.form.name',
defaultMessage: '$$$',
})}`}
initialValue={props.values.name}
required={true}
rules={[
{
required: true,
message: (
<FormattedMessage
id="business.list.table.form.rule.required.name"
defaultMessage="name is required"
/>
),
},
]}
/>
<ProFormSelect
width={proFormSmallItemStyleProps.column2Width / 2 - 8}
name="province"
label={<FormattedMessage id="business.list.table.form.province" defaultMessage="省份" />}
placeholder={`${intl.formatMessage({
id: 'common.please_select',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'business.list.table.form.province',
defaultMessage: '$$$',
})}`}
initialValue={props.values.province}
required={true}
showSearch
debounceTime={500}
request={() => {
const respDataList = formatProvinceByData();
// 初始化有省份数据,默认加载当前省份的城市数据
if (props.values.province) {
respDataList.forEach((item) => {
if (props.values.province === item.value) {
setCityOptions(() => formatCityByProvinceData(item));
}
});
}
return respDataList;
}}
onChange={(_, record2) => {
form.setFieldValue('city', null); // 先清空城市
setCityOptions(() => formatCityByProvinceData(record2));
}}
rules={[
{
required: true,
message: (
<FormattedMessage
id="business.list.table.form.rule.required.province"
defaultMessage="name is required"
/>
),
},
]}
/>
<ProFormSelect
width={proFormSmallItemStyleProps.column2Width / 2 - 8}
name="city"
label={<FormattedMessage id="business.list.table.form.city" defaultMessage="城市" />}
placeholder={`${intl.formatMessage({
id: 'common.please_select',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'business.list.table.form.city',
defaultMessage: '$$$',
})}`}
initialValue={props.values.city}
required={true}
showSearch
debounceTime={500}
options={cityOptions}
onChange={changeCity}
rules={[
{
required: true,
message: (
<FormattedMessage
id="business.list.table.form.rule.required.city"
defaultMessage="name is required"
/>
),
},
]}
/>
<ProFormText
width={proFormSmallItemStyleProps.column2Width}
name="address"
label={<FormattedMessage id="business.list.table.form.address" defaultMessage="地址" />}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'business.list.table.form.address',
defaultMessage: '$$$',
})}`}
initialValue={props.values.address}
required={true}
rules={[
{
required: true,
message: (
<FormattedMessage
id="business.list.table.form.rule.required.address"
defaultMessage="name is required"
/>
),
},
]}
/>
<ProFormText
width={proFormSmallItemStyleProps.width}
name="industry"
label={<FormattedMessage id="business.list.table.form.industry" defaultMessage="行业" />}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'business.list.table.form.industry',
defaultMessage: '$$$',
})}`}
initialValue={props.values.industry}
required={true}
rules={[
{
required: true,
message: (
<FormattedMessage
id="business.list.table.form.rule.required.industry"
defaultMessage="name is required"
/>
),
},
]}
/>
<ProFormText
width={proFormSmallItemStyleProps.width}
name="contacts"
label={
<FormattedMessage id="business.list.table.form.contacts" defaultMessage="联系人" />
}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'business.list.table.form.contacts',
defaultMessage: '$$$',
})}`}
initialValue={props.values.contacts}
required={true}
rules={[
{
required: true,
message: (
<FormattedMessage
id="business.list.table.form.rule.required.contacts"
defaultMessage="name is required"
/>
),
},
]}
/>
<ProFormText
width={proFormSmallItemStyleProps.width}
name="contactWay"
label={
<FormattedMessage id="business.list.table.form.contactWay" defaultMessage="联系方式" />
}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'business.list.table.form.contactWay',
defaultMessage: '$$$',
})}`}
initialValue={props.values.contactWay}
required={true}
rules={[
{
required: true,
message: (
<FormattedMessage
id="business.list.table.form.rule.required.contactWay"
defaultMessage="name is required"
/>
),
},
]}
/>
<ProFormTextArea
width={proFormSmallItemStyleProps.width}
name="remark"
label={<FormattedMessage id="business.list.table.form.remark" defaultMessage="简介" />}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'business.list.table.form.remark',
defaultMessage: '$$$',
})}`}
initialValue={props.values.remark}
required={true}
rules={[
{
required: true,
message: (
<FormattedMessage
id="business.list.table.form.rule.required.remark"
defaultMessage="name is required"
/>
),
},
]}
disabled={false}
/>
{/* // TODO level3 按UI实际效果调整上传logo & 改用上传base64格式编码 换手动上传 */}
<ProFormUploadButton
width={proFormSmallItemStyleProps.width}
max={1}
action="/api/v1/file/uploadImage"
name="logo"
label={<FormattedMessage id="business.list.table.form.logo" defaultMessage="logo" />}
fieldProps={{
name: 'file',
listType: 'picture-card',
beforeUpload: beforeUploadImage,
data: { path: 'user/avatar' },
headers: {
'X-CSRFToken': cookie.load('csrftoken'),
'X-Token': `${localStorage.getItem('access') || ''}`,
},
}}
initialValue={props.values.logo}
required={true}
rules={[
{
required: true,
message: (
<FormattedMessage
id="business.list.table.form.rule.required.logo"
defaultMessage="name is required"
/>
),
},
]}
/>
</ProForm.Group>
</ModalForm>
);
};
export default UpdateForm;

@ -0,0 +1,11 @@
.businessInfo_page {
/* 企业算法列表 */
}
.businessInfo_page .algorithmCard_box .tag_type {
padding: 2px 4px;
color: white;
font-weight: 500;
font-size: 12px;
background: linear-gradient(180deg, #21c7ff 0%, #428cff 100%);
border-radius: 2px;
}

@ -0,0 +1,15 @@
.businessInfo_page {
/* 企业算法列表 */
// 算法卡片
.algorithmCard_box {
.tag_type {
padding: 2px 4px;
color: white;
font-weight: 500;
font-size: 12px;
background: linear-gradient(180deg, #21c7ff 0%, #428cff 100%);
border-radius: 2px;
}
}
}

@ -6,25 +6,35 @@
* 3
* 4
*/
import { useBusinessInfo } from '@/hooks/useBusinessInfo';
import { useMoment } from '@/hooks/useMoment';
import { getBusinessAlgorithmList, getBusinessDetail } from '@/services/testApi/businessProject';
import { isSuccessApi } from '@/utils/forApi';
import { ProCard, ProList } from '@ant-design/pro-components';
import { Button } from 'antd';
import { alarmRulesEnums } from '@/enums/status';
import { PageContainer, ProCard, ProList } from '@ant-design/pro-components';
import { Image, Tabs } from 'antd';
import React, { useEffect, useState } from 'react';
import { proTablePaginationOptions } from '../../../../config/defaultTable';
// import DeviceStatusCard from './components/DeviceStatusCard';
// import CreateForm from './components/CreateForm';
import { useMoment } from '@/hooks/useMoment';
import { postAlarmList } from '@/services/realTime/alarmlist';
import AlarmDetails from './components/AlarmDetails';
// import AlarmDetails from './components/AlarmDetails';
import AccountPsw from './components/accountPsw';
import AlgorithmCard from './components/algorithmCard';
import BaseInfo from './components/baseInfo';
import UpdateForm from './components/updateForm';
import './index.less';
import { ReactComponent as YaxinshijueIcon } from '/public/home/yaxinshijue_icon.svg';
// eslint-disable-next-line react-hooks/rules-of-hooks
const { formatTimeByDateType } = useMoment();
const BusinessInfo: React.FC = () => {
//state
const [detailInfo, setDetailInfo] = useState<Record<string, any>>({});
const { getStoreBusinessInfo } = useBusinessInfo();
const [updateModalOpen, setUpdateModalOpen] = useState<boolean>(false);
const [currentRow, setCurrentRow] = useState<Record<string, any>>({});
// 未启用
/**
* @en-US International configuration
* @zh-CN
@ -36,160 +46,42 @@ const BusinessInfo: React.FC = () => {
const [currentPageSize, setCurrentPageSize] = useState<number>(10);
const [currentPage, setCurrentPage] = useState<number>(1);
const [total, setTotal] = useState<number>(0);
const [list, setList] = useState<any>([]);
// const [activeTabIndex, setActiveTabIndex] = useState<number>(0);
const [dataTestList, setdataTestList] = useState<any>([]);
const [tab, setTab] = useState<string>(alarmRulesEnums[0].key);
const [tabs, setTabs] = useState<any>([]);
const changeProjectTab = (key: string) => {
setTab(key);
console.log(key);
// eslint-disable-next-line @typescript-eslint/no-use-before-define
initList(key);
};
const getTabs = () => {
// if (alarmRulesEnums.length) {
// setTab(alarmRulesEnums[0].key);
// }
setTabs(alarmRulesEnums);
};
// useEffect(() => {
// getTabs();
// }, []);
// const handleCreateModal = () => {
// if (createModalOpen) {
// setCreateModalOpen(false);
// setCurrentRow(undefined);
// } else {
// setCreateModalOpen(true);
// }
// };
// 更新
const handleUpdateModal = () => {
if (updateModalOpen) {
setUpdateModalOpen(false);
setCurrentRow(undefined);
} else {
setUpdateModalOpen(true);
}
};
// const handleDestroy = async () => {
// if (modalOpen) {
// setModalOpen(false);
// setCurrentRow(undefined);
// } else {
// setModalOpen(true);
// }
// // deleteBusinessImageDeleteBusinessImage({ id: selectedRow.id })
// // .then(() => {
// // message.success(intl.formatMessage({ id: 'common.success', defaultMessage: '$$$' }));
// // actionRef.current?.reload();
// // })
// // .catch(() => {
// // message.error(intl.formatMessage({ id: 'common.failure', defaultMessage: '$$$' }));
// // });
// };
// const { confirm } = Modal;
// const showConfirm = (record: any) => {
// confirm({
// title: `确定删除${record.name}吗`,
// icon: <QuestionCircleFilled />,
// content: '确定删除服务器1吗删除后将找不到此服务器请谨慎操作.',
// okText: '确认',
// cancelText: '取消',
// width: 560,
// onOk() {
// console.log('OK');
// },
// onCancel() {
// console.log('Cancel');
// },
// });
// };
// 处理初始值
function initDataTestList(dataList: Record<string, any>[]) {
console.log(dataList, 'initDataTestList');
function loadList(dataList: Record<string, any>[]) {
console.log(dataList, 'loadList');
let finalList: { content: React.JSX.Element }[] = [];
if (Array.isArray(dataList) && dataList.length) {
finalList = dataList.map((record, index) => {
finalList = dataList.map((info, index) => {
return {
content: (
<ProCard
className="gn"
style={{ backgroundColor: '#F5F6FF', margin: 0, padding: 0, borderRadius: 4 }}
bodyStyle={{ margin: 0, padding: 0 }}
>
<div
style={{
display: 'flex',
alignItems: 'center',
padding: 20,
justifyContent: 'flex-start',
}}
onClick={() => {
console.log(index, 'index');
setUpdateModalOpen(true);
setCurrentRow(record);
}}
>
<Image width={96} height={96} preview={false} src={record.picture_path[0]} />
<div
style={{
marginLeft: 16,
height: 90,
display: 'flex',
flexDirection: 'column',
justifyContent: 'space-between',
color: '#666',
}}
>
<div>
:{' '}
<span
style={{
color: '#333',
}}
>
{record.warning_name}
</span>
</div>
<div>
:{' '}
<span
style={{
color: '#333',
}}
>
{record.device_name}
</span>
</div>
<div>
:{' '}
<span
style={{
color: '#333',
}}
>
{formatTimeByDateType(record.trigger_time)}
</span>
</div>
</div>
</div>
</ProCard>
),
content: <AlgorithmCard info={info} key={index}></AlgorithmCard>,
};
});
}
setdataTestList(() => [...finalList]);
setList(() => [...finalList]);
}
// 初始化加载
async function initList(tabId: string = tab) {
async function loadDetailData() {
const { id } = getStoreBusinessInfo();
const resp = await getBusinessDetail({ id });
if (isSuccessApi(resp)) {
setDetailInfo(resp?.data);
}
}
// 算法列表
async function initList(tabId: string) {
const reqParams = {
page: currentPage,
pageSize: currentPageSize,
@ -197,138 +89,118 @@ const BusinessInfo: React.FC = () => {
warning_type: tabId,
// ...rest,
};
const resp = await postAlarmList({ ...reqParams });
const resp = await getBusinessAlgorithmList({ ...reqParams });
// console.log(resp,'resp');
// setCurrentPageSize(resp?.data?.count)
setTotal(resp?.data?.count);
initDataTestList(resp?.data?.results);
// request={async (params = {}, sort) => {
// const { current, ...rest } = params;
// const reqParams = {
// page: current,
// desc: false,
// warning_type: tab,
// ...rest,
// };
// if (sort && Object.keys(sort).length) {
// reqParams.orderKey = Object.keys(sort)[0];
// let sort_select = sort[reqParams.orderKey];
// reqParams.desc = sort_select === 'descend';
// }
// // TODO 联调查询设备状态接口
// console.log(reqParams, 'reqParams');
// let resp = await postAlarmList({ ...reqParams });
// console.log(resp, 'postAlarmList_result');
// initDataTestList(resp.result);
// // return {
// // data: resp.result,
// // success: resp.success,
// // total: resp.count,
// // current: resp.count,
// // pageSize: resp.count,
// // };
// }}
loadList(resp?.data?.results);
}
useEffect(() => {
getTabs();
// initList();
}, []);
useEffect(() => {
// 模拟异步请求数据
initList();
}, [currentPage, currentPageSize]);
useEffect(() => {
loadDetailData();
}, []);
return (
<PageContainer
// title={false}
// content={
// <div style={{
// display: 'flex',
// justifyContent: 'space-between'
// }}>
// <div style={{
// fontWeight: 600,
// fontSize: 20,
// color: '#333'
// }}></div>
// </div>
// }
>
<ProCard
className="gn"
bodyStyle={{ padding: 10, margin: 0 }}
style={{ padding: 0, margin: 0 }}
>
<Tabs
activeKey={tab}
items={tabs}
onChange={(key) => {
changeProjectTab(key);
}}
></Tabs>
<ProList<any>
className="gn"
ghost={true}
itemCardProps={{
ghost: true,
bodyStyle: { padding: 0, margin: 0 },
style: {
width: '100%',
border: 0,
// minHeight: 700
// padding: 0, margin: 0
},
}}
cardProps={{
bodyStyle: {
padding: '8px 16px 16px',
borderRadius: 8,
},
}}
pagination={{
...proTablePaginationOptions,
total: total,
current: currentPage,
pageSize: currentPageSize,
showSizeChanger: true,
onChange: (page, pageSize) => {
console.log(page, pageSize);
setCurrentPage(page);
setCurrentPageSize(pageSize);
},
}}
showActions="hover"
rowSelection={false}
grid={{ gutter: 16, xs: 1, md: 2, lg: 2, xl: 3, xxl: 3 }}
metas={{
type: {
// 不展示在筛选项
hideInSearch: true,
},
content: {
hideInSearch: true,
},
actions: {
cardActionProps: 'extra',
},
}}
dataSource={dataTestList}
/>
</ProCard>
<div className="businessInfo_page pb-[1px]">
<div className="gn_head_card mb-[20px]">
<ProCard
className="gn_card pb-[16px]"
title={<span className="head5"></span>}
extra={
<Button
type="primary"
onClick={() => {
handleUpdateModal();
}}
>
</Button>
}
>
<div className="baseInfo_box">
<div className="flex pb-[12px]">
{/* // TODO 替换使用公司的logo字段 */}
<YaxinshijueIcon></YaxinshijueIcon>
<div>
<span className="head5 ">{detailInfo?.name}</span>
<div className="color_2 py-[12px]">
: {formatTimeByDateType(detailInfo?.create_time)}
</div>
</div>
</div>
<BaseInfo info={detailInfo}></BaseInfo>
</div>
</ProCard>
</div>
<div className="gn_head_card mb-[20px]">
<ProCard className="gn_card" title={<span className="head5"></span>}>
<AccountPsw></AccountPsw>
</ProCard>
</div>
{/* <CreateForm
createModalOpen={createModalOpen}
values={currentRow || {}}
handleModal={handleCreateModal}
reload={actionRef.current?.reload}
/> */}
<AlarmDetails
updateModalOpen={updateModalOpen}
values={currentRow || {}}
handleModal={handleUpdateModal}
reload={initList}
/>
</PageContainer>
<div className="gn_head_card mb-[20px]">
<ProCard
className="gn_card pb-[16px]"
title={<span className="head5">({total})</span>}
>
<ProList<any>
className="gn"
ghost={true}
itemCardProps={{
ghost: true,
bodyStyle: { padding: 0, margin: 0 },
style: {
width: '100%',
border: 0,
},
}}
cardProps={{
bodyStyle: {
borderRadius: 8,
},
}}
pagination={{
...proTablePaginationOptions,
total: total,
current: currentPage,
pageSize: currentPageSize,
showSizeChanger: true,
onChange: (page, pageSize) => {
console.log(page, pageSize);
setCurrentPage(page);
setCurrentPageSize(pageSize);
},
}}
showActions="hover"
rowSelection={false}
grid={{ gutter: 16, xs: 1, md: 2, lg: 2, xl: 3, xxl: 3 }}
metas={{
type: {
// 不展示在筛选项
hideInSearch: true,
},
content: {
hideInSearch: true,
},
actions: {
cardActionProps: 'extra',
},
}}
dataSource={list}
/>
</ProCard>
<UpdateForm
updateModalOpen={updateModalOpen}
values={detailInfo || {}}
handleModal={handleUpdateModal}
reload={loadDetailData}
/>
</div>
</div>
);
};

@ -2,7 +2,7 @@
* @Author: donghao donghao@supervision.ltd
* @Date: 2024-04-07 14:02:00
* @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2024-04-19 09:28:53
* @LastEditTime: 2024-04-24 14:47:04
* @FilePath: \general-ai-manage\src\pages\BusinessProject\BusinessProject.tsx
* @Description:
* @
@ -14,6 +14,7 @@
*
*/
import { CommButton } from '@/components/Button';
import { isSuccessApi } from '@/utils/forApi';
import { ReactComponent as BusinessBannerLogo } from '/public/home/business_banner_logo.svg';
import { ReactComponent as BusinessHeader1 } from '/public/home/business_header_1.svg';
import { ReactComponent as BusinessHeader2 } from '/public/home/business_header_2.svg';
@ -147,9 +148,9 @@ const BusinessProject: React.FC = () => {
}
// 企业列表数据api
async function fetchData() {
const res = await getBusinessProject({ page: 1, pageSize: 10, ...querysData });
if (res.success) {
toListDomByData(res.data.results);
const resp = await getBusinessProject({ page: 1, pageSize: 10, ...querysData });
if (isSuccessApi(resp)) {
toListDomByData(resp.data.results);
}
}
@ -261,12 +262,6 @@ const BusinessProject: React.FC = () => {
handleModal={handleCreateModal}
reload={reloadList}
/>
{/* <CreateForm
createModalOpen={updateModalOpen}
values={currentRow || {}}
handleModal={handleCreateModal}
reload={reloadList}
/> */}
</div>
);
};

@ -852,7 +852,7 @@ exports[`Login Page should show login form 1`] = `
class="ant-form-item-control-input-content"
>
<span
class="ant-input-affix-wrapper ant-input-psw ant-input-psw-large ant-input-affix-wrapper-lg"
class="ant-input-affix-wrapper ant-input-pwd ant-input-pwd-large ant-input-affix-wrapper-lg"
>
<span
class="ant-input-prefix"
@ -879,9 +879,9 @@ exports[`Login Page should show login form 1`] = `
</span>
<input
class="ant-input ant-input-lg"
id="psw"
id="pwd"
placeholder="Password: ant.design"
type="psw"
type="pwd"
value=""
/>
<span
@ -889,7 +889,7 @@ exports[`Login Page should show login form 1`] = `
>
<span
aria-label="eye-invisible"
class="anticon anticon-eye-invisible ant-input-psw-icon"
class="anticon anticon-eye-invisible ant-input-pwd-icon"
role="img"
tabindex="-1"
>

@ -14,6 +14,7 @@ import {
ProFormText,
} from '@ant-design/pro-components';
import { isSuccessApi } from '@/utils/forApi';
import { useEmotionCss } from '@ant-design/use-emotion-css';
import { Helmet, SelectLang, history, useIntl, useModel } from '@umijs/max';
import { Alert, Form, message, theme } from 'antd';
@ -148,15 +149,15 @@ const Login: React.FC = () => {
const handleSubmit = async (values: API.Login) => {
try {
// 登录
const msg = await postBaseLogin({ ...values });
// const msg = await login({ ...values, type });
if (msg.success === true) {
const resp = await postBaseLogin({ ...values });
// const resp = await login({ ...values, type });
if (isSuccessApi(resp)) {
// const defaultLoginSuccessMessage = intl.formatMessage({
// id: 'pages.login.success',
// defaultMessage: '登录成功!',
// });
//
localStorage.setItem('access', msg.data?.token || '');
localStorage.setItem('access', resp.data?.token || '');
fetchUserInfo().then(() => {
const urlParams = new URL(window.location.href).searchParams;
console.log('fetchUserInfo_redirect', urlParams.get('redirect'));
@ -170,9 +171,9 @@ const Login: React.FC = () => {
}
// 如果失败去设置用户错误信息
setUserLoginState({
status: msg.success ? 'ok' : 'error',
status: isSuccessApi(resp) ? 'ok' : 'error',
type: type,
currentAuthority: msg.data?.token || '',
currentAuthority: resp.data?.token || '',
});
} catch (error) {
const defaultLoginFailureMessage = intl.formatMessage({
@ -191,7 +192,7 @@ const Login: React.FC = () => {
useEffect(() => {
// localStorage.removeItem('access')
form.setFieldsValue({ username: 'admin', psw: 'Sju2984?' });
form.setFieldsValue({ username: 'admin', pwd: 'Sju2984?' });
// console.log(form.getFieldsValue(), 'login_form');
}, []);
@ -240,7 +241,7 @@ const Login: React.FC = () => {
style: {
width: '100%',
borderRadius: '4px',
backgroundColor: '#004FB2',
backgroundColor: token.colorPrimary,
},
},
}}
@ -280,7 +281,7 @@ const Login: React.FC = () => {
]}
></ProFormText>
<ProFormText.Password
name="psw"
name="pwd"
fieldProps={{
size: 'large',
prefix: (
@ -345,7 +346,7 @@ const Login: React.FC = () => {
<a
style={{
float: 'right',
color: '#154DDD',
color: token.colorText,
}}
>

@ -107,7 +107,7 @@ export const errorConfig: RequestConfig = {
// 拦截响应数据,进行个性化处理
const { data } = response as unknown as ResponseStructure;
if (data?.success === false) {
if (data?.meta?.code >= 400) {
message.error('请求失败!');
}
return response;

@ -63,7 +63,7 @@ declare namespace API {
type LoginParams = {
username?: string;
psw?: string;
pwd?: string;
autoLogin?: boolean;
type?: string;
};

@ -1,81 +0,0 @@
/*
* @Author: donghao donghao@supervision.ltd
* @Date: 2024-04-01 19:20:30
* @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2024-04-02 17:19:56
* @FilePath: \uighur-recognition-web2\src\services\realTime\alarmRules.ts
* @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
// @ts-ignore
/* eslint-disable */
import { request } from '@umijs/max';
/** 告警列表 */
export async function getAlarmRules(
params: API.SearchAlarmRulesParams,
options?: { [key: string]: any },
) {
return request<API.Response & { data?: API.PageResult; msg?: string }>(`/api/warning_rule/`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
params: {
...params,
},
...(options || {}),
});
}
/** 更新告警列表 */
export async function postAlarmRules(
body: API.UpdateAlarmRulesParams,
options?: { [key: string]: any },
) {
return request<API.Response & { data?: API.PageResult; msg?: string }>(`/api/warning_rule/`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}
/** 离线告警规则 */
export async function getOfflineAlarmRules(
params: API.SearchAlarmRulesParams,
options?: { [key: string]: any },
) {
return request<API.Response & { data?: API.PageResult; msg?: string }>(
`/api/upload_warning_rule/`,
{
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
params: {
...params,
},
...(options || {}),
},
);
}
/** 离线更新告警规则 */
export async function postOfflineAlarmRules(
body: API.UpdateAlarmRulesParams,
options?: { [key: string]: any },
) {
return request<API.Response & { data?: API.PageResult; msg?: string }>(
`/api/upload_warning_rule/`,
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
},
);
}

@ -1,72 +0,0 @@
// @ts-ignore
/* eslint-disable */
import { request } from '@umijs/max';
/** 告警列表 */
export async function postAlarmList(
body: API.SearchAlarmListParams,
options?: { [key: string]: any },
) {
return request<API.Response & { data?: API.PageResult; msg?: string }>(`/api/warning_info/`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
params: {
...body,
},
...(options || {}),
});
}
/** 忽略事件 */
export async function postIgnoringvents(
body: API.IgnoringventsParams,
options?: { [key: string]: any },
) {
return request<API.Response & { data?: API.PageResult; msg?: string }>(`/api/detect_result/`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}
/** 上传告警列表 */
export async function postUploadAlarmList(
params: API.SearchAlarmListParams,
options?: { [key: string]: any },
) {
return request<API.Response & { data?: API.PageResult; msg?: string }>(
`/api/upload_warning_info/`,
{
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
params: {
...params,
},
...(options || {}),
},
);
}
/** 上传忽略事件 */
export async function postUploadIgnoringvents(
body: API.UploadIgnoringventsParams,
options?: { [key: string]: any },
) {
return request<API.Response & { data?: API.PageResult; msg?: string }>(
`/api/ignore_warning_info/`,
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
},
);
}

@ -1,20 +0,0 @@
/*
* @Author: donghao donghao@supervision.ltd
* @Date: 2024-04-01 19:20:30
* @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2024-04-01 19:22:27
* @FilePath: \uighur-recognition-web2\src\services\realTime\index.ts
* @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
// @ts-ignore
/* eslint-disable */
// API 更新时间:
// API 唯一标识:
import * as alarmlist from './alarmlist';
import * as alarmRules from './alarmRules';
import * as interfaces from './interfaces';
export default {
alarmlist,
alarmRules,
interfaces,
};

@ -1,89 +0,0 @@
/*
* @Author: donghao donghao@supervision.ltd
* @Date: 2024-04-01 19:20:30
* @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2024-04-02 17:44:55
* @FilePath: \uighur-recognition-web2\src\services\realTime\interfaces.ts
* @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
// @ts-ignore
/* eslint-disable */
import { request } from '@umijs/max';
/** 接口列表 */
export async function getInterfaces(
params: API.SearchAlarmRulesParams | any,
options?: { [key: string]: any },
) {
return request<API.Response & { data?: API.PageResult; msg?: string }>(`/api/device/`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
params: {
...params,
},
...(options || {}),
});
}
/** 更新接口列表 */
export async function postInterfaces(
body: API.UpdateInterfacesParams | any,
options?: { [key: string]: any },
) {
return request<API.Response & { data?: API.PageResult; msg?: string }>(`/api/device/`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}
/** 测试接口 */
export async function postTestDevice(
body: API.UpdateInterfacesParams | any,
options?: { [key: string]: any },
) {
return request<API.Response & { data?: API.PageResult; msg?: string }>(`/api/test_device/`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}
/** 离线设备列表 */
export async function getInterfacesUpload(
params: API.SearchAlarmRulesParams | any,
options?: { [key: string]: any },
) {
return request<API.Response & { data?: API.PageResult; msg?: string }>(`/api/upload_device/`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
params: {
...params,
},
...(options || {}),
});
}
/** 更新接口列表 */
export async function postInterfacesUpload(
body: API.UpdateInterfacesParams | any,
options?: { [key: string]: any },
) {
return request<API.Response & { data?: API.PageResult; msg?: string }>(`/api/upload_device/`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}

@ -1,116 +0,0 @@
// @ts-ignore
/* eslint-disable */
import { request } from '@umijs/max';
/** 重点关注列表 */
export async function getInvolvedList(
params: API.SearchInvolvedParams,
options?: { [key: string]: any },
) {
return request<API.Response & { data?: API.PageResult; msg?: string }>(
`/api/recognition_people/`,
{
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
params: {
...params,
},
...(options || {}),
},
);
}
/** 任务轨迹列表 */
export async function getInvolvedTravelList(
params: API.SearchInvolvedTravelParams,
options?: { [key: string]: any },
) {
return request<API.Response & { data?: API.PageResult; msg?: string }>(`/api/travel_track/`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
params: {
...params,
},
...(options || {}),
});
}
/** 关注与取消关注 */
export async function postRecognition(
body: API.RecognitionParams,
options?: { [key: string]: any },
) {
return request<API.Response & { data?: API.PageResult; msg?: string }>(
`/api/recognition_people/`,
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
},
);
}
/** 上传重点关注列表 */
export async function getUploadInvolvedList(
params: API.SearchInvolvedParams,
options?: { [key: string]: any },
) {
return request<API.Response & { data?: API.PageResult; msg?: string }>(
`/api/upload_recognition_people/`,
{
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
params: {
...params,
},
...(options || {}),
},
);
}
/** 上传任务轨迹列表 */
export async function getUploadInvolvedTravelList(
params: API.SearchInvolvedTravelParams,
options?: { [key: string]: any },
) {
return request<API.Response & { data?: API.PageResult; msg?: string }>(
`/api/upload_travel_track/`,
{
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
params: {
...params,
},
...(options || {}),
},
);
}
/** 上传关注与取消关注 */
export async function postUploadRecognition(
body: API.RecognitionParams,
options?: { [key: string]: any },
) {
return request<API.Response & { data?: API.PageResult; msg?: string }>(
`/api/upload_recognition_people/`,
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
},
);
}

@ -1,150 +0,0 @@
declare namespace API {
type ActionDetection = {
id?: string;
source?: string;
configFile?: string;
type?: string;
remark?: string;
time?: number;
imagesPath?: string;
};
type PageResult = {
list?: any;
page?: number;
pageSize?: number;
total?: number;
};
type AlarmListResponse = {
code?: number;
data?: any;
msg?: string;
success?: boolean;
// count?: number,
// next?: any,
// previous?: any,
// results?:any
};
type SearchAlarmListParams = {
warning_type?: string;
/** 排序方式:升序false(默认)|降序true */
desc?: boolean;
/** 页码 */
page?: number;
/** 每页大小 */
pageSize?: number;
};
type SearchAlarmRulesParams = {
id?: string;
};
type InterfacesForm = {
code?: string;
createTime?: string;
id?: number;
is_use?: number;
device_name?: string;
remark?: string;
device_api?: string;
};
type UpdateAlarmRulesForm = {
warning_name?: string; // 告警规则名称
warning_type?: string; // 告警类型
is_use?: number; // 是否启用
person_number?: number; // 人数
appear_number?: number; // 出现次数
time_interval?: string; // 时间间隔(小时)
time_period?: string; // 时间段(小时)
trigger_start_time?: string; // 敏感起始时间
trigger_end_time?: string; // 敏感结束时间
id?: number;
};
type UpdateAlarmRulesParams = {
warning_name?: string; // 告警规则名称
warning_type?: string; // 告警类型
is_use?: number; // 是否启用
person_number?: number; // 人数
appear_number?: number; // 出现次数
time_interval?: string; // 时间间隔(小时)
time_period?: string; // 时间段(小时)
trigger_start_time?: string; // 敏感起始时间
trigger_end_time?: string; // 敏感结束时间
id?: string;
};
type UpdateInterfacesParams = {
device_name?: string; // 设备名称
device_code?: string; // 设备代码
is_use?: number; // 是否启用
device_api?: string; // 设备地址
device_ip?: string; // IP地址
note?: string; // 备注
device_status?: string; // 设备状态
id?: string;
appear_time?: string; // 设备状态
picture_path?: string;
};
type AlarmDetailsParams = {
warning_name?: string; // 设备名称
picture_path?: any; // 设备代码
device_name?: string; // 是否启用
person_id?: string;
trigger_time?: string;
person_list?: any;
person_classify?: any;
warning_type?: any;
origin?: any;
person_id_list?: any;
id?: any;
};
type IgnoringventsParams = {
is_ignore?: any; // 设备代码 // 是否启用
person_id?: string;
};
type UploadIgnoringventsParams = {
is_ignore?: any; // 设备代码 // 是否启用
id?: string;
};
type SearchInvolvedParams = {
/** 人员标识 0为正常1为重点关注2为白名单 */
classify?: string;
/** 排序方式:升序false(默认)|降序true */
desc?: boolean;
/** 页码 */
page?: number;
/** 每页大小 */
pageSize?: number;
};
type InvolvedDetailsParams = {
/** 人员标识 0为正常1为重点关注2为白名单 */
classify?: string;
/** 人员id */
person_id?: string;
/** 人员照片 */
picture_path?: string;
/** 标记时间 */
classify_time?: string;
/** 设备id */
device_id?: string;
/** 设备名 */
device_name?: string;
/** 出现时间 */
appear_time?: string;
};
type SearchInvolvedTravelParams = {
/** 人员ID */
person_id?: string;
/** 排序方式:升序false(默认)|降序true */
desc?: boolean;
/** 页码 */
page?: number;
/** 每页大小 */
pageSize?: number;
};
type RecognitionParams = {
/** 人员ID */
person_id?: string;
/** 人员标识 0为正常1为重点关注2为白名单 */
classify?: string;
};
}

@ -54,8 +54,8 @@ declare namespace API {
type loginUserParams = {
/** The user name for login */
username: string;
/** The psw for login in clear text */
psw: string;
/** The pwd for login in clear text */
pwd: string;
};
type Order = {
@ -104,7 +104,7 @@ declare namespace API {
firstName?: string;
lastName?: string;
email?: string;
psw?: string;
pwd?: string;
phone?: string;
/** User Status */
userStatus?: number;

@ -93,7 +93,7 @@ declare namespace API {
/** 新密码 */
newPassword?: string;
/** 密码 */
psw?: string;
pwd?: string;
};
type CORS = {
@ -374,7 +374,7 @@ declare namespace API {
/** DB initial langauge // added by mohamed hassan to support multilanguage */
language?: string;
/** 数据库密码 */
psw?: string;
pwd?: string;
/** 数据库连接端口 */
port?: string;
/** 数据库用户名 */
@ -407,7 +407,7 @@ declare namespace API {
type Login = {
captcha?: string;
captchaId?: string;
psw?: string;
pwd?: string;
username?: string;
};
@ -456,7 +456,7 @@ declare namespace API {
/** 打开到数据库的最大连接数 */
'max-open-conns'?: number;
/** 数据库密码 */
psw?: string;
pwd?: string;
/** 服务器地址:端口 */
path?: string;
/** :端口 */
@ -485,7 +485,7 @@ declare namespace API {
/** 打开到数据库的最大连接数 */
'max-open-conns'?: number;
/** 数据库密码 */
psw?: string;
pwd?: string;
/** 服务器地址:端口 */
path?: string;
/** :端口 */
@ -544,7 +544,7 @@ declare namespace API {
/** 打开到数据库的最大连接数 */
'max-open-conns'?: number;
/** 数据库密码 */
psw?: string;
pwd?: string;
/** 服务器地址:端口 */
path?: string;
/** :端口 */
@ -589,7 +589,7 @@ declare namespace API {
/** 打开到数据库的最大连接数 */
'max-open-conns'?: number;
/** 数据库密码 */
psw?: string;
pwd?: string;
/** 服务器地址:端口 */
path?: string;
/** :端口 */
@ -645,7 +645,7 @@ declare namespace API {
/** redis的哪个数据库 */
db?: number;
/** 密码 */
psw?: string;
pwd?: string;
};
type Register = {
@ -824,7 +824,7 @@ declare namespace API {
/** 打开到数据库的最大连接数 */
'max-open-conns'?: number;
/** 数据库密码 */
psw?: string;
pwd?: string;
/** 服务器地址:端口 */
path?: string;
/** :端口 */
@ -854,7 +854,7 @@ declare namespace API {
/** 打开到数据库的最大连接数 */
'max-open-conns'?: number;
/** 数据库密码 */
psw?: string;
pwd?: string;
/** 服务器地址:端口 */
path?: string;
/** :端口 */

@ -2,7 +2,7 @@
* @Author: donghao donghao@supervision.ltd
* @Date: 2024-04-09 13:46:44
* @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2024-04-19 14:48:49
* @LastEditTime: 2024-04-23 14:36:25
* @FilePath: \general-ai-manage\src\services\testApi\businessProject.ts
* @Description: mock
*/
@ -15,16 +15,19 @@ export async function getBusinessProject(
body: Record<string, any>, //
options?: { [key: string]: any },
) {
return request<API.Response & { data?: API.PageResult; msg?: string }>(`/api/businessProject/`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
params: {
...body,
return request<API.Response & { data?: API.PageResult; msg?: string }>(
`/api/businessProject/list`,
{
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
params: {
...body,
},
...(options || {}),
},
...(options || {}),
});
);
}
// 企业详情
export async function getBusinessDetail(
@ -32,7 +35,26 @@ export async function getBusinessDetail(
options?: { [key: string]: any },
) {
return request<API.Response & { data?: API.PageResult; msg?: string }>(
`/api/businessProject/detail/`,
`/api/businessProject/detail`,
{
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
params: {
...body,
},
...(options || {}),
},
);
}
/** 企业算法分页列表 */
export async function getBusinessAlgorithmList(
body: Record<string, any>, //
options?: { [key: string]: any },
) {
return request<API.Response & { data?: API.PageResult; msg?: string }>(
`/api/businessProject/algorithm`,
{
method: 'GET',
headers: {

@ -0,0 +1,21 @@
/*
* @Author: donghao donghao@supervision.ltd
* @Date: 2024-04-24 10:11:48
* @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2024-04-24 10:17:21
* @FilePath: \general-ai-platform-web\src\utils\forApi.ts
* @Description:
*/
/**
* @
* @param result
* @returns boolean
*/
export function isSuccessApi(result: API.API_COMMON_DATA): boolean {
const { meta } = result;
if (meta.code < 300 && meta.code >= 200) {
return true;
}
return false;
}

9
types/index.d.ts vendored

@ -1,4 +1,11 @@
export namespace API {
/**common api */
export type API_COMMON_DATA = {
data: any; // 业务层数据
meta: {
code: number; // 接口状态码 200 成功
}; // 接口信息
};
/** GET /api/currentUser */
export type GET_API_CURRENT_USER_QUERY = {
/** example: 123 */
@ -102,7 +109,7 @@ export namespace API {
/** example: admin */
username: string;
/** example: ant.design */
psw: string;
pwd: string;
/** example: true */
autoLogin: boolean;
/** example: account */

Loading…
Cancel
Save