Browse Source

feat: 展示用户安装的应用列表

qiji
nili 3 months ago
parent
commit
796a72de35
  1. 83
      dist/51.a2ea1b3b.async.js
  2. 328
      dist/531.35af34f5.async.js
  3. 287
      dist/531.4c68f902.async.js
  4. 235
      dist/539.290aefb9.async.js
  5. 153
      dist/539.49b7b156.async.js
  6. 1
      dist/761.f7bbde11.async.js
  7. 42
      dist/822.4ba8fa04.async.js
  8. 1
      dist/942.561ac28f.async.js
  9. 1
      dist/_umi_route_preload_helper.cad1d6aa.js
  10. 1
      dist/_umi_route_preload_helper.d525eb24.js
  11. 4
      dist/index.html
  12. 1
      dist/p__AdminManagement.0afb1c76.async.js
  13. 1
      dist/p__AdminManagement.16f4328b.async.js
  14. 1
      dist/p__AdvRecordListV2.7d43902a.async.js
  15. 1
      dist/p__AdvRecordListV2.984e68f4.async.js
  16. 1
      dist/p__MoneyManagement.7ad34f8d.async.js
  17. 1
      dist/p__MoneyManagement.b9d33efc.async.js
  18. 1
      dist/p__Proxy__ProxyAdvRecordListV2.a4fe446b.async.js
  19. 1
      dist/p__Proxy__ProxyAdvRecordListV2.edf1fabd.async.js
  20. 1
      dist/p__Proxy__ProxyUserManagement.7f03f17a.async.js
  21. 1
      dist/p__Proxy__ProxyUserManagement.8c01d23c.async.js
  22. 1
      dist/p__SuperAdmin.92290426.async.js
  23. 1
      dist/p__SuperAdmin.aebf7b0e.async.js
  24. 1
      dist/p__UserManagement.17af3678.async.js
  25. 1
      dist/p__UserManagement.5e827801.async.js
  26. 92
      dist/umi.f4b1ecbd.js
  27. 144
      src/pages/User/LocalAppList.tsx
  28. 29
      src/pages/User/UserInfo.tsx
  29. 7
      src/services/matrix/typings.d.ts

83
dist/51.a2ea1b3b.async.js

File diff suppressed because one or more lines are too long

328
dist/531.35af34f5.async.js

File diff suppressed because one or more lines are too long

287
dist/531.4c68f902.async.js

File diff suppressed because one or more lines are too long

235
dist/539.290aefb9.async.js

File diff suppressed because one or more lines are too long

153
dist/539.49b7b156.async.js

File diff suppressed because one or more lines are too long

1
dist/761.f7bbde11.async.js

File diff suppressed because one or more lines are too long

42
dist/822.4ba8fa04.async.js

File diff suppressed because one or more lines are too long

1
dist/942.561ac28f.async.js

File diff suppressed because one or more lines are too long

1
dist/_umi_route_preload_helper.cad1d6aa.js

@ -0,0 +1 @@
!function(){"use strict";var t="/".replace(/([^/])$/,"$1/"),e=location.pathname,n=e.startsWith(t)&&decodeURI("/".concat(e.slice(t.length)));if(n){var a=document,c=a.head,r=a.createElement.bind(a),i=function(t,e,n){var a,c=e.r[t]||(null===(a=Object.entries(e.r).find((function(e){var n=e[0];return new RegExp("^".concat(n.replace(/\/:[^/]+/g,"/[^/]+").replace("/*","/.+"),"$")).test(t)})))||void 0===a?void 0:a[1]);return null==c?void 0:c.map((function(t){var a=e.f[t][1],c=e.f[t][0];return{type:c.split(".").pop(),url:"".concat(n.publicPath).concat(c),attrs:[["data-".concat(e.b),"".concat(e.p,":").concat(a)]]}}))}(n,{"p":"ant-design-pro","b":"webpack","f":[["134.6fc81d91.async.js",134],["169.57647c7d.async.js",169],["p__Welcome.61596037.async.js",185],["p__MoneyManagement.b9d33efc.async.js",190],["247.3fe8fb10.async.js",247],["t__plugin-layout__Layout.6cae69f5.chunk.css",301],["t__plugin-layout__Layout.4594a64b.async.js",301],["p__User__Login__index.9d3ab92e.async.js",366],["p__DeviceOwnerApp.c61abcd9.async.js",371],["390.41467286.async.js",390],["393.38316f72.async.js",393],["397.fb5f72c1.async.js",397],["p__SuperAdmin.aebf7b0e.async.js",455],["p__Proxy__ProxyUserManagement.8c01d23c.async.js",526],["531.35af34f5.async.js",531],["539.290aefb9.async.js",539],["p__AdvRecordListV2.984e68f4.async.js",542],["p__Bind.b6ee068f.async.js",557],["559.016bfdbb.async.js",559],["p__404.0c100574.async.js",571],["635.20e45f05.async.js",635],["p__App__AppManagement.4cf1b18c.async.js",731],["761.f7bbde11.async.js",761],["p__AdminManagement.0afb1c76.async.js",816],["841.614ef4c0.async.js",841],["p__AdvRecordList.fc092f59.async.js",857],["p__UserManagement.17af3678.async.js",903],["905.6e225d1b.async.js",905],["930.fca7adbf.async.js",930],["p__Proxy__ProxyAdvRecordListV2.a4fe446b.async.js",990]],"r":{"/*":[19,27],"/":[0,5,6,18,20,27],"/welcome":[0,1,2,10,18,28,5,6,20,27],"/super":[0,1,4,12,14,15,27,28,5,6,18,20],"/adminList":[0,1,14,15,22,23,27,5,6,18,20],"/bind":[0,1,10,11,17,18,28,5,6,20,27],"/appList":[0,1,4,11,14,15,21,27,28,5,6,18,20],"/advList/:code":[0,1,14,15,18,24,25,27,28,5,6,20],"/advListV2/:code":[0,1,14,15,16,18,24,27,28,5,6,20],"/user/:code":[0,1,14,15,26,27,28,5,6,18,20],"/money/:code":[0,1,3,14,15,27,28,5,6,18,20],"/app/:code":[0,1,8,14,15,18,24,27,28,5,6,20],"/user/login":[0,1,7,14],"/proxy/advListV2/:code":[0,1,14,15,18,24,27,28,29,5,6,20],"/proxy/user/:code":[0,1,13,14,15,27,28,5,6,18,20]}},{publicPath:"/"});null==i||i.forEach((function(t){var e,n=t.type,a=t.url;if("js"===n)(e=r("script")).src=a,e.async=!0;else{if("css"!==n)return;(e=r("link")).href=a,e.rel="preload",e.as="style"}t.attrs.forEach((function(t){e.setAttribute(t[0],t[1]||"")})),c.appendChild(e)}))}}();

1
dist/_umi_route_preload_helper.d525eb24.js

@ -1 +0,0 @@
!function(){"use strict";var t="/".replace(/([^/])$/,"$1/"),e=location.pathname,n=e.startsWith(t)&&decodeURI("/".concat(e.slice(t.length)));if(n){var a=document,c=a.head,r=a.createElement.bind(a),i=function(t,e,n){var a,c=e.r[t]||(null===(a=Object.entries(e.r).find((function(e){var n=e[0];return new RegExp("^".concat(n.replace(/\/:[^/]+/g,"/[^/]+").replace("/*","/.+"),"$")).test(t)})))||void 0===a?void 0:a[1]);return null==c?void 0:c.map((function(t){var a=e.f[t][1],c=e.f[t][0];return{type:c.split(".").pop(),url:"".concat(n.publicPath).concat(c),attrs:[["data-".concat(e.b),"".concat(e.p,":").concat(a)]]}}))}(n,{"p":"ant-design-pro","b":"webpack","f":[["51.a2ea1b3b.async.js",51],["134.6fc81d91.async.js",134],["169.57647c7d.async.js",169],["p__Welcome.61596037.async.js",185],["p__MoneyManagement.7ad34f8d.async.js",190],["247.3fe8fb10.async.js",247],["t__plugin-layout__Layout.6cae69f5.chunk.css",301],["t__plugin-layout__Layout.4594a64b.async.js",301],["p__User__Login__index.9d3ab92e.async.js",366],["p__DeviceOwnerApp.c61abcd9.async.js",371],["390.41467286.async.js",390],["393.38316f72.async.js",393],["397.fb5f72c1.async.js",397],["p__SuperAdmin.92290426.async.js",455],["p__Proxy__ProxyUserManagement.7f03f17a.async.js",526],["531.4c68f902.async.js",531],["539.49b7b156.async.js",539],["p__AdvRecordListV2.7d43902a.async.js",542],["p__Bind.b6ee068f.async.js",557],["559.016bfdbb.async.js",559],["p__404.0c100574.async.js",571],["635.20e45f05.async.js",635],["p__App__AppManagement.4cf1b18c.async.js",731],["p__AdminManagement.16f4328b.async.js",816],["822.4ba8fa04.async.js",822],["841.614ef4c0.async.js",841],["p__AdvRecordList.fc092f59.async.js",857],["p__UserManagement.5e827801.async.js",903],["905.6e225d1b.async.js",905],["930.fca7adbf.async.js",930],["942.561ac28f.async.js",942],["p__Proxy__ProxyAdvRecordListV2.edf1fabd.async.js",990]],"r":{"/*":[20,28],"/":[1,6,7,19,21,28],"/welcome":[1,2,3,11,19,29,6,7,21,28],"/super":[0,1,2,5,13,15,16,24,28,29,6,7,19,21],"/adminList":[0,1,2,23,24,30,6,7,19,21,28],"/bind":[1,2,11,12,18,19,29,6,7,21,28],"/appList":[0,1,2,5,12,15,16,22,24,28,29,6,7,19,21],"/advList/:code":[0,1,2,15,16,19,24,25,26,28,29,6,7,21],"/advListV2/:code":[0,1,2,15,16,17,19,24,25,28,29,6,7,21],"/user/:code":[0,1,2,15,16,24,27,28,29,6,7,19,21],"/money/:code":[0,1,2,4,15,16,24,28,29,6,7,19,21],"/app/:code":[0,1,2,9,15,16,19,24,25,28,29,6,7,21],"/user/login":[1,2,8,15,24],"/proxy/advListV2/:code":[0,1,2,15,16,19,24,25,28,29,31,6,7,21],"/proxy/user/:code":[0,1,2,14,15,16,24,28,29,6,7,19,21]}},{publicPath:"/"});null==i||i.forEach((function(t){var e,n=t.type,a=t.url;if("js"===n)(e=r("script")).src=a,e.async=!0;else{if("css"!==n)return;(e=r("link")).href=a,e.rel="preload",e.as="style"}t.attrs.forEach((function(t){e.setAttribute(t[0],t[1]||"")})),c.appendChild(e)}))}}();

4
dist/index.html

@ -7,10 +7,10 @@
<title>Ant Design Pro</title>
<link rel="stylesheet" href="/umi.1ca9308c.css">
<script async src="/scripts/loading.js"></script>
<script src="/_umi_route_preload_helper.d525eb24.js"></script>
<script src="/_umi_route_preload_helper.cad1d6aa.js"></script>
</head>
<body>
<div id="root"></div>
<script src="/umi.e0c98130.js"></script>
<script src="/umi.f4b1ecbd.js"></script>
</body>
</html>

1
dist/p__AdminManagement.0afb1c76.async.js

File diff suppressed because one or more lines are too long

1
dist/p__AdminManagement.16f4328b.async.js

File diff suppressed because one or more lines are too long

1
dist/p__AdvRecordListV2.7d43902a.async.js

File diff suppressed because one or more lines are too long

1
dist/p__AdvRecordListV2.984e68f4.async.js

File diff suppressed because one or more lines are too long

1
dist/p__MoneyManagement.7ad34f8d.async.js

File diff suppressed because one or more lines are too long

1
dist/p__MoneyManagement.b9d33efc.async.js

File diff suppressed because one or more lines are too long

1
dist/p__Proxy__ProxyAdvRecordListV2.a4fe446b.async.js

File diff suppressed because one or more lines are too long

1
dist/p__Proxy__ProxyAdvRecordListV2.edf1fabd.async.js

File diff suppressed because one or more lines are too long

1
dist/p__Proxy__ProxyUserManagement.7f03f17a.async.js

File diff suppressed because one or more lines are too long

1
dist/p__Proxy__ProxyUserManagement.8c01d23c.async.js

File diff suppressed because one or more lines are too long

1
dist/p__SuperAdmin.92290426.async.js

File diff suppressed because one or more lines are too long

1
dist/p__SuperAdmin.aebf7b0e.async.js

File diff suppressed because one or more lines are too long

1
dist/p__UserManagement.17af3678.async.js

File diff suppressed because one or more lines are too long

1
dist/p__UserManagement.5e827801.async.js

File diff suppressed because one or more lines are too long

92
dist/umi.e0c98130.js → dist/umi.f4b1ecbd.js

File diff suppressed because one or more lines are too long

144
src/pages/User/LocalAppList.tsx

@ -0,0 +1,144 @@
import { SearchOutlined } from '@ant-design/icons';
import { ProColumns, ProTable } from '@ant-design/pro-components';
import { Button, Input, Modal, Space } from 'antd';
import { useEffect, useState } from 'react';
import { evilAppList } from '@/services/matrix/superAdmin';
export type LocalAppListProps = {
data: API.UserBo;
onClose: () => void;
};
interface LocalApp {
appName?: string;
packageName?: string;
evil: boolean;
}
const LocalAppList: React.FC<LocalAppListProps> = (props) => {
const [appArr, setAppArr] = useState<LocalApp[]>();
const [filteredAppArr, setFilteredAppArr] = useState<LocalApp[]>();
const columns: ProColumns<LocalApp>[] = [
{
title: '应用名',
dataIndex: 'appName',
ellipsis: true,
hideInSearch: true,
filterDropdown: ({ setSelectedKeys, selectedKeys, confirm, clearFilters }) => (
<div style={{ padding: 8 }}>
<Input
placeholder="搜索应用"
value={selectedKeys[0]}
onChange={(e) => setSelectedKeys(e.target.value ? [e.target.value] : [])}
onPressEnter={() => confirm()}
style={{ marginBottom: 8, display: 'block' }}
/>
<Space>
<Button onClick={() => confirm()} type="primary">
</Button>
<Button onClick={() => clearFilters && clearFilters()} type="link">
</Button>
</Space>
</div>
),
onFilter: (value, record) => {
if (typeof value === 'string' && typeof record?.appName === 'string') {
return record.appName.includes(value);
}
return false;
},
filterIcon: (filtered) => (
<SearchOutlined
style={{ color: filtered ? '#1890ff' : undefined }}
onPointerOverCapture={undefined}
onPointerMoveCapture={undefined}
/>
),
},
{
title: '应用包名',
dataIndex: 'packageName',
hideInSearch: true,
ellipsis: true,
filterDropdown: ({ setSelectedKeys, selectedKeys, confirm, clearFilters }) => (
<div style={{ padding: 8 }}>
<Input
placeholder="搜索包名"
value={selectedKeys[0]}
onChange={(e) => setSelectedKeys(e.target.value ? [e.target.value] : [])}
onPressEnter={() => confirm()}
style={{ marginBottom: 8, display: 'block' }}
/>
<Space>
<Button onClick={() => confirm()} type="primary">
</Button>
<Button onClick={() => clearFilters && clearFilters()} type="link">
</Button>
</Space>
</div>
),
onFilter: (value, record) => {
if (typeof value === 'string' && typeof record?.packageName === 'string') {
return record.packageName.includes(value);
}
return false;
},
filterIcon: (filtered) => (
<SearchOutlined
style={{ color: filtered ? '#1890ff' : undefined }}
onPointerOverCapture={undefined}
onPointerMoveCapture={undefined}
/>
),
},
];
const fetchApp = async () => {
const res = await evilAppList();
if (res.data) {
let common: LocalApp[] = [];
let remain: LocalApp[] = [];
props.data.localAppList?.forEach((x) => {
if (res.data?.some((y) => y.packageName === x.packageName)) {
common.push({ ...x, evil: true });
} else {
remain.push({ ...x, evil: false });
}
});
setAppArr([...common, ...remain]);
setFilteredAppArr([...common, ...remain]);
}
};
useEffect(() => {
fetchApp();
}, []);
return (
<Modal style={{ width: 600 }} onCancel={props.onClose} visible={true} footer={[]}>
<ProTable
onRow={(record) => {
return {
style: {
backgroundColor: record.evil ? 'red' : 'transparent',
},
};
}}
search={false}
onReset={() => {
setFilteredAppArr(appArr);
}}
columns={columns}
dataSource={filteredAppArr}
/>
</Modal>
);
};
export default LocalAppList;

29
src/pages/User/UserInfo.tsx

@ -1,15 +1,19 @@
import { Avatar, List, Popover, Row } from 'antd';
import React from 'react';
import React, { useState } from 'react';
import { envMsg } from '../../utils/commonUtil';
import { cent2Yuan, formatIncome } from '../../utils/numberUtils';
import LocalAppList from './LocalAppList';
export type UserInfoProps = {
data: API.UserBo;
};
const UserInfo: React.FC<UserInfoProps> = (props) => {
const [localAppVisible, setLocalAppVisible] = useState<boolean>(false);
let msg = envMsg(props.data.env);
return (
<>
<Popover
content={
<>
@ -21,6 +25,20 @@ const UserInfo: React.FC<UserInfoProps> = (props) => {
<label></label>
{cent2Yuan(props.data.realMoney)}
</p>
{props.data.localAppList && props.data.localAppList.length > 0 && (
<p>
<label></label>
{props.data.localAppList.length}
<a
onClick={() => {
setLocalAppVisible(true);
}}
style={{ marginLeft: 20 }}
>
</a>
</p>
)}
{msg.length > 0 && (
<List
size="small"
@ -48,6 +66,15 @@ const UserInfo: React.FC<UserInfoProps> = (props) => {
</p>
</Row>
</Popover>
{localAppVisible && (
<LocalAppList
onClose={() => {
setLocalAppVisible(false);
}}
data={props.data}
/>
)}
</>
);
};

7
src/services/matrix/typings.d.ts

@ -142,6 +142,11 @@ declare namespace API {
date?: string[];
};
type LocalApp = {
appName?: string;
packageName?: string;
};
type MatrixAdmin = {
id?: number;
name?: string;
@ -195,6 +200,7 @@ declare namespace API {
createdAt?: number;
id?: number;
ecpmReal?: number;
ecpmAdmin?: number;
user?: UserBo;
adminName?: string;
};
@ -518,6 +524,7 @@ declare namespace API {
env?: number;
status?: number;
wxOpenId?: string;
localAppList?: LocalApp[];
createdAt?: number;
};

Loading…
Cancel
Save