shenwu hai 6 meses
pai
achega
4ff98b4fae

+ 8 - 13
src/pages/MiniApp/Consume/tableConfig.tsx

@@ -4,25 +4,20 @@ export const columns = (enumList:any): ProColumns<any>[] => {
     let arr: any =enumList?.CHANGE_TYPE.values
     return [
         {
-            title: "ID",
-            dataIndex: 'id',
-            hideInSearch: true,
-            align: "center",
-            key: "id"
-        },
-        {
-            title: "用户ID",
-            dataIndex: 'userId',
-            key: "userId",
-            align: "center",
-            hideInSearch: true,
+            title: 'openId',
+            dataIndex: 'openId',
+            align: 'center',
+            width: 70,
+            ellipsis: true,
+            render: (_, row) => {
+                return row?.wechatMiniappUser?.openId
+            }
         },
         {
             title: "小说名称",
             dataIndex: 'bookInfo',
             key: "bookInfo",
             align: "center",
-            hideInSearch: true,
             render: (a, b) => {
                 return b?.bookInfo?.bookName || b?.bookInfo?.bookName
             },

+ 2 - 2
src/pages/MiniApp/MiniAppUser/WeChat/index.tsx

@@ -43,12 +43,12 @@ const Page: React.FC = () => {
             headerTitle={"微信小程序用户列表"}
             rowKey={(r) => r.id}
             search={{
-                labelWidth: 70,
+                labelWidth: 120,
             }}
             request={async (params) => {
                 return await getList.run(params)
             }}
-            columns={columns({ enumList: enumList || [], del, upDate })}
+            columns={columns({ enumList: enumList || [], upDate })}
         // bordered
         />
     </PageContainer>

+ 82 - 18
src/pages/MiniApp/MiniAppUser/WeChat/tableConfig.tsx

@@ -1,8 +1,10 @@
 import { ProColumns } from "@ant-design/pro-components";
-import { Badge, Popconfirm, Switch } from "antd";
+import {  Space, Switch } from "antd";
+import BookList from '../bookList';
+import LoginList from "../loginList";
 
-export const columns = (params: { enumList: { [key: string]: any }, del: (id: any) => void, upDate: (params: { id: any, enabled: boolean }) => void }): ProColumns<any>[] => {
-    let { enumList, del, upDate } = params
+export const columns = (params: { enumList: { [key: string]: any },  upDate: (params: { id: any, enabled: boolean }) => void }): ProColumns<any>[] => {
+    let { enumList, upDate } = params
     return [
         {
             title: "openId",
@@ -22,7 +24,6 @@ export const columns = (params: { enumList: { [key: string]: any }, del: (id: an
             dataIndex: 'nickname',
             key: "nickname",
             align: "center",
-            hideInSearch: true,
         },
         {
             title: "手机号",
@@ -43,6 +44,26 @@ export const columns = (params: { enumList: { [key: string]: any }, del: (id: an
                 return arr.get(b?.userStanding) || '-'
             }
         },
+        {
+            title: "累计充值金额",
+            dataIndex: 'chargeAmount',
+            key: "chargeAmount",
+            valueType: 'digit',
+            align: "center",
+            render:(a,b)=>{
+                return b?.chargeAmount
+            }
+        },
+        {
+            title: "累计充值次数",
+            dataIndex: 'chargeNum',
+            key: "chargeNum",
+            valueType: 'digit',
+            align: "center",
+            render:(a,b)=>{
+                return b?.chargeNum
+            }
+        },
         {
             title: "书币余额",
             dataIndex: 'coinNumMin',
@@ -53,6 +74,36 @@ export const columns = (params: { enumList: { [key: string]: any }, del: (id: an
                 return b?.coinNum
             }
         },
+        {
+            title: "VIP到期时间",
+            dataIndex: 'vipExpireTime',
+            key: "vipExpireTime",
+            valueType: 'digit',
+            align: "center",
+            render:(a,b)=>{
+                return b?.vipExpireTime || '-'
+            }
+        },
+        {
+            title: "用户来源",
+            dataIndex: 'userSource',
+            key: "userSource",
+            valueType: 'digit',
+            align: "center",
+            render:(a,b)=>{
+                return b?.userSource || '-'
+            }
+        },
+        {
+            title: "登录设备",
+            dataIndex: 'osType',
+            key: "osType",
+            valueType: 'digit',
+            align: "center",
+            render:(a,b)=>{
+                return b?.osType || '-'
+            }
+        },
         {
             title: "最近登录IP",
             dataIndex: 'lastLoginIp',
@@ -92,20 +143,21 @@ export const columns = (params: { enumList: { [key: string]: any }, del: (id: an
                 return <Switch checked={b.enabled} size="default" checkedChildren="正常" unCheckedChildren="禁用" onChange={(enabled) => { upDate({ id: b.id, enabled }) }} />
             }
         },
-        // {
-        //     title: '操作',
-        //     dataIndex: 'cz',
-        //     key: 'cz',
-        //     width: 90,
-        //     ellipsis: true,
-        //     align: 'center',
-        //     hideInSearch: true,
-        //     render: (a: any, b: any) => {
-        //         return <Popconfirm title="确定要删除此用户?" onConfirm={() => { del(b?.id) }}>
-        //             <a style={{ color: 'red' }}>删除</a>
-        //         </Popconfirm>
-        //     }
-        // },
+        {
+            title: '操作',
+            dataIndex: 'cz',
+            key: 'cz',
+            width: 90,
+            ellipsis: true,
+            align: 'center',
+            hideInSearch: true,
+            render: (a: any, b: any) => {
+                return <Space size={0}>
+                    <BookList data={b} />
+                    <LoginList data={b} />
+                </Space>
+            }
+        },
         // 搜索条件
         {
             title: "最早登录时间",
@@ -119,6 +171,18 @@ export const columns = (params: { enumList: { [key: string]: any }, del: (id: an
             valueType: 'date',
             hideInTable: true
         },
+        {
+            title: "注册开始时间",
+            dataIndex: 'startTime',
+            valueType: 'date',
+            hideInTable: true
+        },
+        {
+            title: "注册结束时间",
+            dataIndex: 'endTime',
+            valueType: 'date',
+            hideInTable: true
+        },
 
     ];
 }

+ 54 - 0
src/pages/MiniApp/MiniAppUser/bookList/index.tsx

@@ -0,0 +1,54 @@
+import { ActionType, ProTable } from "@ant-design/pro-components"
+import { columns } from "./tableConfig"
+import { useAjax } from "@/Hook/useAjax"
+import {  useRef, useState } from "react"
+import { Button, Drawer, Modal } from "antd"
+import { shelfLisOfPage } from "@/services/miniApp/miniAppUser"
+import { useModel } from "@umijs/max"
+type Props={
+    data: {
+        id: number
+    }
+}
+const Page: React.FC<Props> = (props) => {
+    const {initialState} = useModel('@@initialState')
+    const [open, setOpen] = useState(false)
+    const actionRef = useRef<ActionType>();
+    let getList = useAjax((params) => shelfLisOfPage(params), { type: 'table' })
+    return <>
+        <Button
+            size="small"
+            type="link"
+            onClick={()=>{setOpen(true)}}
+        >书架列表</Button>
+        <Modal
+            open={open}
+            footer={false}
+            onCancel={()=>{setOpen(false)}}
+            title={"书架列表"}
+            width={"50%"}
+            destroyOnClose
+        >
+            <ProTable<any, any>
+                actionRef={actionRef}
+                scroll={{ x: true ,y:'50vh'}}
+                headerTitle={false}
+                rowKey={(r) => r.id}
+                search={false}
+                params={{
+                    appId:initialState?.selectApp?.id,
+                    userId:props.data.id
+                }}
+                request={async (params) => {
+                    if (params?.appId) {
+                        return await getList.run(params)
+                    }
+                }}
+                columns={columns()}
+            // bordered
+            />
+        </Modal>
+    </>
+
+}
+export default Page

+ 51 - 0
src/pages/MiniApp/MiniAppUser/bookList/tableConfig.tsx

@@ -0,0 +1,51 @@
+import { ProColumns } from "@ant-design/pro-components";
+import { Image } from "antd";
+
+export const columns = (): ProColumns<any>[] => {
+    return [
+        {
+            title: '封面',
+            dataIndex: 'picUrl',
+            key: 'picUrl',
+            width: 90,
+            ellipsis: true,
+            align: 'center',
+            hideInSearch: true,
+            render: (a: any, b: any) => {
+               let book = b?.shortBookInfo?.bookInfo || b?.longBookInfo?.bookInfo
+              return (
+                <div style={{ position: 'relative' }}>
+                  <Image
+                    src={book?.picUrl}
+                    style={{ width: 50 }}
+                    onError={(e: any) => {
+                      e.target.src = localStorage.getItem('nocover');
+                    }}
+                  />
+                </div>
+              );
+            },
+          },
+        {
+            title: "书名",
+            dataIndex: 'bookName',
+            key: "bookName",
+            align: "center",
+            render: (a: any, b: any) => {
+                let book = b?.shortBookInfo?.bookInfo || b?.longBookInfo?.bookInfo
+               return book?.bookName
+             },
+        },
+        {
+            title: "最近阅读时间",
+            dataIndex: 'lastReadingTime',
+            key: "lastReadingTime",
+            align: "center",
+            render: (a: any, b: any) => {
+                let book = b?.shortBookInfo || b?.longBookInfo
+               return book?.lastReadingTime
+             },
+        },
+
+    ];
+}

+ 54 - 0
src/pages/MiniApp/MiniAppUser/loginList/index.tsx

@@ -0,0 +1,54 @@
+import { ActionType, ProTable } from "@ant-design/pro-components"
+import { columns } from "./tableConfig"
+import { useAjax } from "@/Hook/useAjax"
+import { useRef, useState } from "react"
+import { Button, Modal } from "antd"
+import { loginListOfPage } from "@/services/miniApp/miniAppUser"
+import { useModel } from "@umijs/max"
+type Props = {
+    data: {
+        id: number
+    }
+}
+const Page: React.FC<Props> = (props) => {
+    const {initialState} = useModel('@@initialState')
+    const [open, setOpen] = useState(false)
+    const actionRef = useRef<ActionType>();
+    let getList = useAjax((params) => loginListOfPage(params), { type: 'table' })
+    return <>
+        <Button
+            size="small"
+            type="link"
+            onClick={() => { setOpen(true) }}
+        >登录记录</Button>
+        <Modal
+            open={open}
+            footer={false}
+            onCancel={()=>{setOpen(false)}}
+            title={"登录记录"}
+            width={"50%"}
+            destroyOnClose
+        >
+            <ProTable<any, any>
+                 actionRef={actionRef}
+                 scroll={{ x: true ,y:'50vh'}}
+                 headerTitle={false}
+                 rowKey={(r) => r.id}
+                 search={false}
+                params={{
+                    appId:initialState?.selectApp?.id,
+                    userId:props.data.id
+                }}
+                request={async (params) => {
+                    if (params?.appId) {
+                        return await getList.run(params)
+                    }
+                }}
+                columns={columns()}
+            // bordered
+            />
+        </Modal>
+    </>
+
+}
+export default Page

+ 24 - 0
src/pages/MiniApp/MiniAppUser/loginList/tableConfig.tsx

@@ -0,0 +1,24 @@
+import { ProColumns } from "@ant-design/pro-components";
+
+export const columns = (): ProColumns<any>[] => {
+    return [
+        {
+            title: "登录平台",
+            dataIndex: 'appName',
+            key: "appName",
+            align: "center",
+        },
+        {
+            title: "登录时间",
+            dataIndex: 'loginTime',
+            key: "loginTime",
+            align: "center",
+        },
+        {
+            title: "登录IP",
+            dataIndex: 'loginIp',
+            key: "loginIp",
+            align: "center",
+        },
+    ];
+}

+ 23 - 6
src/pages/MiniApp/PayLog/Long/tableConfig.tsx

@@ -1,24 +1,28 @@
 import { ProColumns } from "@ant-design/pro-components";
+import { useModel } from "@umijs/max";
 import { Badge } from "antd";
 
 export const columns = (): ProColumns<any>[] => {
+    let {getEnum} = useModel("global")
     let payChannelObj: any = { '1': '微信小程序支付' };
     let orderTypeObj: any = { '1': '书币充值', "2": "vip充值", "3": "购买整本" };
     let orderStatusObj: any = { '1': '待支付', "2": "已支付" };
     return [
         {
-            title: "用户Id",
-            dataIndex: 'userId',
-            key: "userId",
-            align: "center",
-            hideInSearch: true,
+            title: 'openId',
+            dataIndex: 'openId',
+            align: 'center',
+            width: 70,
+            ellipsis: true,
+            render: (_, row) => {
+                return row?.wechatMiniappUser?.openId
+            }
         },
         {
             title: "小说名称",
             dataIndex: 'bookName',
             key: "bookName",
             align: "center",
-            hideInSearch: true,
             render:(a,b:any)=>{
                 return b?.bookInfo?.bookName
             }
@@ -90,6 +94,19 @@ export const columns = (): ProColumns<any>[] => {
             hideInSearch: true,
             align: "center",
         },
+        {
+            title: '归因渠道',
+            dataIndex: 'userChannel',
+            width: 170,
+            align: 'center',
+            ellipsis: true,
+            valueType: 'select',
+            valueEnum: getEnum("USER_CHANNEL", "map"),
+            render: (_, row) => {
+                let str = getEnum("USER_CHANNEL", "map").get(row?.wechatMiniappUser?.userChannel)
+                return str
+            }
+        },
         // 搜索条件
         {
             title: "开始时间",

+ 33 - 17
src/pages/MiniApp/PayLog/Short/tableConfig.tsx

@@ -1,25 +1,29 @@
 import { ProColumns } from "@ant-design/pro-components";
+import { useModel } from "@umijs/max";
 import { Badge } from "antd";
 
 export const columns = (): ProColumns<any>[] => {
+    let {getEnum} = useModel("global")
     let payChannelObj: any = { '1': '微信小程序支付' };
     let orderTypeObj: any = { '1': '书币充值', "2": "vip充值", "3": "购买整本" };
     let orderStatusObj: any = { '1': '待支付', "2": "已支付" };
     return [
         {
-            title: "用户Id",
-            dataIndex: 'userId',
-            key: "userId",
-            align: "center",
-            hideInSearch: true,
+            title: 'openId',
+            dataIndex: 'openId',
+            align: 'center',
+            width: 70,
+            ellipsis: true,
+            render: (_, row) => {
+                return row?.wechatMiniappUser?.openId
+            }
         },
         {
             title: "小说名称",
             dataIndex: 'bookName',
             key: "bookName",
             align: "center",
-            hideInSearch: true,
-            render:(a,b:any)=>{
+            render: (a, b: any) => {
                 return b?.bookInfo?.bookName
             }
         },
@@ -28,9 +32,9 @@ export const columns = (): ProColumns<any>[] => {
             dataIndex: 'payChannel',
             key: "payChannel",
             align: "center",
-            valueType:'select',
-            valueEnum:payChannelObj,
-            render: (a: any,b:any) => {
+            valueType: 'select',
+            valueEnum: payChannelObj,
+            render: (a: any, b: any) => {
                 return payChannelObj[b.payChannel]
             },
         },
@@ -45,10 +49,10 @@ export const columns = (): ProColumns<any>[] => {
             title: "订单类型",
             dataIndex: 'orderType',
             key: "orderType",
-            valueType:'select',
-            valueEnum:orderTypeObj,
+            valueType: 'select',
+            valueEnum: orderTypeObj,
             align: "center",
-            render: (a: any,b:any) => {
+            render: (a: any, b: any) => {
                 return orderTypeObj[b.orderType]
             }
         },
@@ -56,10 +60,10 @@ export const columns = (): ProColumns<any>[] => {
             title: "订单状态",
             dataIndex: 'orderStatus',
             key: "orderStatus",
-            valueType:'select',
-            valueEnum:orderStatusObj,
+            valueType: 'select',
+            valueEnum: orderStatusObj,
             align: "center",
-            render: (a: any,b:any) => {
+            render: (a: any, b: any) => {
                 return <Badge text={orderStatusObj[b.orderStatus]} status={b.orderStatus != 1 ? "success" : "warning"} />
             }
         },
@@ -97,7 +101,19 @@ export const columns = (): ProColumns<any>[] => {
             hideInSearch: true,
             align: "center",
         },
-        
+        {
+            title: '归因渠道',
+            dataIndex: 'userChannel',
+            width: 170,
+            align: 'center',
+            ellipsis: true,
+            valueType: 'select',
+            valueEnum: getEnum("USER_CHANNEL", "map"),
+            render: (_, row) => {
+                let str = getEnum("USER_CHANNEL", "map").get(row?.wechatMiniappUser?.userChannel)
+                return str
+            }
+        },
         // 搜索条件
         {
             title: "开始时间",

+ 20 - 14
src/pages/MiniApp/ReadLog/Long/tableConfig.tsx

@@ -1,27 +1,24 @@
+import { wechatScene } from "@/utils";
 import { ProColumns } from "@ant-design/pro-components";
 
 export const columns = (): ProColumns<any>[] => {
     return [
         {
-            title: "ID",
-            dataIndex: 'id',
-            hideInSearch: true,
-            align: "center",
-            key: "id"
-        },
-        {
-            title: "用户ID",
-            dataIndex: 'userId',
-            key: "userId",
-            align: "center",
+            title: 'openId',
+            dataIndex: 'openId',
+            align: 'center',
+            width: 70,
+            ellipsis: true,
+            render: (_, row) => {
+                return row?.wechatMiniappUser?.openId
+            }
         },
         {
             title: "小说名称",
             dataIndex: 'bookName',
             key: "bookName",
             align: "center",
-            hideInSearch: true,
-            render:(a,b:any)=>{
+            render: (a, b: any) => {
                 return b?.bookInfo?.bookName
             }
         },
@@ -31,10 +28,19 @@ export const columns = (): ProColumns<any>[] => {
             key: "bookChapterName",
             hideInSearch: true,
             align: "center",
-            render:(a,b)=>{
+            render: (a, b) => {
                 return b?.chapterInfo?.chapterName
             }
         },
+        {
+            title: "阅读场景",
+            dataIndex: 'readCondition',
+            key: "readCondition",
+            align: "center",
+            render:(_,row)=>{
+                return wechatScene[row.readCondition]?.replace(/(.*/ig,'')
+            }
+        },
         {
             title: "阅读时间",
             dataIndex: 'createTime',

+ 13 - 14
src/pages/MiniApp/ReadLog/Short/tableConfig.tsx

@@ -1,28 +1,24 @@
+import { wechatScene } from "@/utils";
 import { ProColumns } from "@ant-design/pro-components";
 
 export const columns = (): ProColumns<any>[] => {
     return [
         {
-            title: "ID",
-            dataIndex: 'id',
-            hideInSearch: true,
-            align: "center",
-            key: "id"
-        },
-        {
-            title: "用户ID",
-            dataIndex: 'userId',
-            key: "userId",
-            align: "center",
-            
+            title: 'openId',
+            dataIndex: 'openId',
+            align: 'center',
+            width: 70,
+            ellipsis: true,
+            render: (_, row) => {
+                return row?.wechatMiniappUser?.openId
+            }
         },
         {
             title: "小说名称",
             dataIndex: 'bookName',
             key: "bookName",
             align: "center",
-            hideInSearch: true,
-            render:(a,b:any)=>{
+            render: (a, b: any) => {
                 return b?.bookInfo?.bookName
             }
         },
@@ -38,6 +34,9 @@ export const columns = (): ProColumns<any>[] => {
             dataIndex: 'readCondition',
             key: "readCondition",
             align: "center",
+            render:(_,row)=>{
+                return wechatScene[row.readCondition]?.replace(/(.*/ig,'')
+            }
         },
         {
             title: "阅读时间",

+ 21 - 0
src/services/miniApp/miniAppUser/index.tsx

@@ -0,0 +1,21 @@
+import { api } from '@/services/api';
+import { request } from '@umijs/max';
+/**
+ * 小程序用户书架列表
+ */
+export async function shelfLisOfPage(params: any) {
+    return request(api + `/admin/wechatMiniappUser/shelfLisOfPage`, {
+      method: 'GET',
+      params,
+    });
+  }
+  
+  /**
+   * 小程序用户登录日志
+   */
+  export async function loginListOfPage(params: any) {
+    return request(api + `/admin/wechatMiniappUser/loginListOfPage`, {
+      method: 'GET',
+      params,
+    });
+  }

+ 197 - 0
src/utils/index.ts

@@ -63,4 +63,201 @@ export const searchToObj =(searchStr: string) => {
         paramsObj[key] = value;
     });
     return paramsObj
+}
+// 小程序场景列表
+export const wechatScene:any={
+    "1000": "其他",
+    "1001": "发现页小程序「最近使用」列表(基础库2.2.4-2.29.0版本包含「我的小程序」列表,2.29.1版本起仅为「最近使用」列表)",
+    "1005": "微信首页顶部搜索框的搜索结果页",
+    "1006": "发现栏小程序主入口搜索框的搜索结果页",
+    "1007": "单人聊天会话中的小程序消息卡片",
+    "1008": "群聊会话中的小程序消息卡片",
+    "1010": "收藏夹",
+    "1011": "扫描二维码",
+    "1012": "长按图片识别二维码",
+    "1013": "扫描手机相册中选取的二维码",
+    "1014": "小程序订阅消息(与1107相同)",
+    "1017": "前往小程序体验版的入口页",
+    "1019": "微信钱包(微信客户端7.0.0版本改为支付入口)",
+    "1020": "公众号 profile 页相关小程序列表(已废弃)",
+    "1022": "聊天顶部置顶小程序入口(微信客户端6.6.1版本起废弃)",
+    "1023": "安卓系统桌面图标",
+    "1024": "小程序 profile 页",
+    "1025": "扫描一维码",
+    "1026": "发现栏小程序主入口,「附近的小程序」列表",
+    "1027": "微信首页顶部搜索框搜索结果页「使用过的小程序」列表",
+    "1028": "我的卡包",
+    "1029": "小程序中的卡券详情页",
+    "1030": "自动化测试下打开小程序",
+    "1031": "长按图片识别一维码",
+    "1032": "扫描手机相册中选取的一维码",
+    "1034": "微信支付完成页",
+    "1035": "公众号自定义菜单",
+    "1036": "App 分享消息卡片",
+    "1037": "小程序打开小程序",
+    "1038": "从另一个小程序返回",
+    "1039": "摇电视",
+    "1042": "添加好友搜索框的搜索结果页",
+    "1043": "公众号模板消息",
+    "1044": "带 shareTicket 的小程序消息卡片 详情",
+    "1045": "朋友圈广告",
+    "1046": "朋友圈广告详情页",
+    "1047": "扫描小程序码",
+    "1048": "长按图片识别小程序码",
+    "1049": "扫描手机相册中选取的小程序码",
+    "1052": "卡券的适用门店列表",
+    "1053": "搜一搜的结果页",
+    "1054": "顶部搜索框小程序快捷入口(微信客户端版本6.7.4起废弃)",
+    "1056": "聊天顶部音乐播放器右上角菜单",
+    "1057": "钱包中的银行卡详情页",
+    "1058": "公众号文章",
+    "1059": "体验版小程序绑定邀请页",
+    "1060": "微信支付完成页(与1034相同)",
+    "1064": "微信首页连Wi-Fi状态栏",
+    "1065": "URL scheme 详情",
+    "1067": "公众号文章广告",
+    "1068": "附近小程序列表广告(已废弃)",
+    "1069": "移动应用通过openSDK进入微信,打开小程序",
+    "1071": "钱包中的银行卡列表页",
+    "1072": "二维码收款页面",
+    "1073": "客服消息列表下发的小程序消息卡片",
+    "1074": "公众号会话下发的小程序消息卡片",
+    "1077": "摇周边",
+    "1078": "微信连Wi-Fi成功提示页",
+    "1079": "微信游戏中心",
+    "1081": "客服消息下发的文字链",
+    "1082": "公众号会话下发的文字链",
+    "1084": "朋友圈广告原生页",
+    "1088": "会话中查看系统消息,打开小程序",
+    "1089": "微信聊天主界面下拉,「最近使用」栏(基础库2.2.4-2.29.0版本包含「我的小程序」栏,2.29.1版本起仅为「最近使用」栏",
+    "1090": "长按小程序右上角菜单唤出最近使用历史",
+    "1091": "公众号文章商品卡片",
+    "1092": "城市服务入口",
+    "1095": "小程序广告组件",
+    "1096": "聊天记录,打开小程序",
+    "1097": "微信支付签约原生页,打开小程序",
+    "1099": "页面内嵌插件",
+    "1100": "红包封面详情页打开小程序",
+    "1101": "远程调试热更新(开发者工具中,预览 -> 自动预览 -> 编译并预览)",
+    "1102": "公众号 profile 页服务预览",
+    "1103": "发现页小程序「我的小程序」列表(基础库2.2.4-2.29.0版本废弃,2.29.1版本起生效)",
+    "1104": "微信聊天主界面下拉,「我的小程序」栏(基础库2.2.4-2.29.0版本废弃,2.29.1版本起生效)",
+    "1106": "聊天主界面下拉,从顶部搜索结果页,打开小程序",
+    "1107": "订阅消息,打开小程序",
+    "1113": "安卓手机负一屏,打开小程序(三星)",
+    "1114": "安卓手机侧边栏,打开小程序(三星)",
+    "1119": "【企业微信】工作台内打开小程序",
+    "1120": "【企业微信】个人资料页内打开小程序",
+    "1121": "【企业微信】聊天加号附件框内打开小程序",
+    "1124": "扫“一物一码”打开小程序",
+    "1125": "长按图片识别“一物一码”",
+    "1126": "扫描手机相册中选取的“一物一码”",
+    "1129": "微信爬虫访问 详情",
+    "1131": "浮窗(8.0版本起仅包含被动浮窗)",
+    "1133": "硬件设备打开小程序 详情",
+    "1135": "小程序profile页相关小程序列表,打开小程序",
+    "1144": "公众号文章 - 视频贴片",
+    "1145": "发现栏 - 发现小程序",
+    "1146": "地理位置信息打开出行类小程序",
+    "1148": "卡包-交通卡,打开小程序",
+    "1150": "扫一扫商品条码结果页打开小程序",
+    "1151": "发现栏 - 我的订单",
+    "1152": "订阅号视频打开小程序",
+    "1153": "“识物”结果页打开小程序",
+    "1154": "朋友圈内打开“单页模式”",
+    "1155": "“单页模式”打开小程序",
+    "1157": "服务号会话页打开小程序",
+    "1158": "群工具打开小程序",
+    "1160": "群待办",
+    "1167": "H5 通过开放标签打开小程序 详情",
+    "1168": "移动/网站应用直接运行小程序",
+    "1169": "发现栏小程序主入口,各个生活服务入口(例如快递服务、出行服务等)",
+    "1171": "微信运动记录(仅安卓)",
+    "1173": "聊天素材用小程序打开 详情",
+    "1175": "视频号主页商店入口",
+    "1176": "视频号直播间主播打开小程序",
+    "1177": "视频号直播商品",
+    "1178": "在电脑打开手机上打开的小程序",
+    "1179": "#话题页打开小程序",
+    "1181": "网站应用打开PC小程序",
+    "1183": "PC微信 - 小程序面板 - 发现小程序 - 搜索",
+    "1184": "视频号链接打开小程序",
+    "1185": "群公告",
+    "1186": "收藏 - 笔记",
+    "1187": "浮窗(8.0版本起)",
+    "1189": "表情雨广告",
+    "1191": "视频号活动",
+    "1192": "企业微信联系人profile页",
+    "1193": "视频号主页服务菜单打开小程序",
+    "1194": "URL Link 详情",
+    "1195": "视频号主页商品tab",
+    "1196": "个人状态打开小程序",
+    "1197": "视频号主播从直播间返回小游戏",
+    "1198": "视频号开播界面打开小游戏",
+    "1200": "视频号广告打开小程序",
+    "1201": "视频号广告详情页打开小程序",
+    "1202": "企微客服号会话打开小程序卡片",
+    "1203": "微信小程序压测工具的请求",
+    "1206": "视频号小游戏直播间打开小游戏",
+    "1207": "企微客服号会话打开小程序文字链",
+    "1208": "聊天打开商品卡片",
+    "1212": "青少年模式申请页打开小程序",
+    "1215": "广告预约打开小程序",
+    "1216": "视频号订单中心打开小程序",
+    "1218": "微信键盘预览打开小程序",
+    "1219": "视频号直播间小游戏一键上车",
+    "1220": "发现页设备卡片打开小程序",
+    "1223": "安卓桌面Widget打开小程序",
+    "1225": "音视频通话打开小程序",
+    "1226": "聊天消息在设备打开后打开小程序",
+    "1228": "视频号原生广告组件打开小程序",
+    "1230": "订阅号H5广告进入小程序",
+    "1231": "动态消息提醒入口打开小程序",
+    "1232": "搜一搜竞价广告打开小程序",
+    "1233": "小程序搜索页人气游戏模块打开小游戏",
+    "1238": "看一看信息流广告打开小程序",
+    "1242": "小程序发现页门店快送模块频道页进入小程序",
+    "1244": "#tag搜索结果页打开小程序",
+    "1245": "小程序发现页门店快送搜索结果页进入小程序",
+    "1248": "通过小程序账号迁移进入小程序",
+    "1252": "搜一搜小程序搜索页「小功能」模块进入小程序",
+    "1254": "发现页「动态」卡片 打开小程序",
+    "1255": "发现页「我的」卡片 打开小程序",
+    "1256": "pc端小程序面板「最近使用」列表",
+    "1257": "pc端小程序面板「我的小程序」列表",
+    "1258": "pc端小程序面板「为电脑端优化」模块",
+    "1259": "pc端小程序面板「小游戏专区」模块",
+    "1260": "pc端小程序面板「推荐在电脑端使用」列表",
+    "1261": "公众号返佣商品卡片",
+    "1265": "小程序图片详情页打开小程序",
+    "1266": "小程序图片长按半屏入口打开小程序",
+    "1267": "小程序图片会话角标打开小程序",
+    "1271": "微信聊天主界面下拉,「我的常用小程序」栏",
+    "1272": "发现页「游戏」服务tab打开小程序",
+    "1273": "发现页「常用的小程序」列表",
+    "1278": "发现页「发现小程序」列表打开小程序",
+    "1279": "发现页「发现小程序」合集页打开小程序",
+    "1280": "下拉任务栏小程序垂搜「建议使用」打开小程序",
+    "1281": "下拉任务栏小程序垂搜「发现小程序」打开小程序",
+    "1282": "听一听播放器打开小程序",
+    "1285": "发现页「发现小程序」短剧合集打开小程序",
+    "1286": "明文scheme打开小程序",
+    "1287": "公众号短剧贴片打开小程序",
+    "1292": "发现页「发现小程序」poi 详情页打开小程序",
+    "1293": "发现页短剧卡片追剧页打开小程序",
+    "1295": "下拉任务栏小程序垂搜「发现小程序」广告打开小程序",
+    "1296": "视频号付费短剧气泡打开小程序",
+    "1297": "发现-小程序-搜索「发现小程序」打开小程序",
+    "1298": "下拉任务栏小程序垂搜「发现小程序」打开的合集访问小程序",
+    "1299": "下拉任务栏小程序垂搜「发现小程序」poi 详情页打开小程序",
+    "1300": "发现-小程序-搜索「发现小程序」打开的合集访问小程序",
+    "1301": "发现-小程序-搜索「发现小程序」poi 详情页打开小程序",
+    "1302": "PC端面板「发现小程序」",
+    "1303": "发现页短剧卡片视频流打开小程序",
+    "1304": "手机负一屏打开小程序(比如oppo手机)",
+    "1305": "公众号播放结束页打开小程序",
+    "1306": "公众号短剧固定选集入口打开小程序",
+    "1307": "发现页附近服务境外专区打开小程序",
+    "1308": "PC端面板小游戏专区页面",
+    "1309": "公众号文章打开小游戏CPS卡片"
 }