aardio 文档

aardio 范例: UPnP 端口映射查看工具

//端口映射管理
import win.ui;
/*DSG{{*/
var winform = win.form(text="UPnP 端口映射查看工具";right=966;bottom=622)
winform.add()
/*}}*/

import web.view;
var wb = web.view(winform);

import sys.upnp.nat;
var natUpnp = sys.upnp.nat();

//测试添加端口映射,除第一个参数以外的其他参数都可以省略
natUpnp.add(9973,"TCP",9973,,"添加端口映射测试")

wb.external = {
    getMappingCollection = function(){
        return web.json.stringifyArray(natUpnp.getTable());
    };
    deleteItem = function(externalPort,protocol){
        return natUpnp.remove(externalPort,protocol)
    };
    natUpnpValid = function(){  
        return natUpnp.valid();
    };
}

wb.html = /**
<!DOCTYPE html><html>
<head>
    <meta charset="utf-8" />
    <title>WebView2</title> 
    <script src="https://lib.baomitu.com/react/17.0.2/umd/react.production.min.js"></script>
    <script src="https://lib.baomitu.com/react-dom/17.0.2/umd/react-dom.production.min.js"></script>
    <script src="https://lib.baomitu.com/antd/4.17.0-alpha.3/antd.min.js"></script>
    <link rel="stylesheet" href="https://lib.baomitu.com/antd/4.17.0-alpha.3/antd.min.css"> 
    <script src="https://unpkg.com/@babel/standalone@7/babel.min.js"></script>
    <style type="text/css"> 
    </style>
</head>
<body>  

<script type="text/babel"> 
    const { useState,useEffect,useCallback,useRef } =  React;
    const { Button,Table,DatePicker,Alert,Tooltip,Space,Tag,Popconfirm } = antd;

    const App = () => { 
            const [data,setData] = useState([]);
            const [valid,setValid] = useState(true);

            useEffect(
                async ()=> {
                    var ds = JSON.parse(await aardio.getMappingCollection());
                    setData(ds);

                    if(!ds.length){
                        setValid(await aardio.natUpnpValid());
                    } 
                },[]
            )   

            return ( 
                <div style={{ width: '100%', margin: '0 auto', padding:'10px' }}>   
                { !valid && <Alert message="当前网络不支持 UPnP 自动端口映射" type="error" showIcon  closable  /> }    
                <Table size="middle"  dataSource={data} columns={[
                        {
                            title: '协议',
                            dataIndex: 'protocol',
                            width: 300, 
                        },
                        {
                            title: '外网端口',
                            dataIndex: 'externalPort', 
                        },
                        {
                            title: '内网端口',
                            dataIndex: 'internalPort', 
                        },
                        {
                            title: '内网主机',
                            dataIndex: 'internalClient', 
                        },
                        {
                            title: '描述',
                            dataIndex: 'description', 
                        },
                        {
                            title: '启用',
                            dataIndex: 'enabled', 
                            render: enabled => (
                                <>
                                    <Tag color={ enabled  ? 'green' : '#CCC' } >
                                        {enabled ? "启用" : "禁用"}
                                    </Tag>
                                </>)
                        },
                        {
                            title: '操作',
                            key: 'action',
                            render: (text, record) => (
                            <Space size="middle"> 
                                <Popconfirm title={"确定删除外网映射端口:"+record.externalPort+" 协议:"+record.protocol+" 吗"} onConfirm={ async ()=>{ 
                                    await aardio.deleteItem(record.externalPort,record.protocol)  
                                    setData(JSON.parse(await aardio.getMappingCollection()));
                                } } okText="确认" cancelText="取消">
                                    <a>删除</a>
                                </Popconfirm>
                            </Space>
                            ),
                        },
                ]} />

                </div> 
            );
    };

    ReactDOM.render(<App />, document.querySelector('#app')); 
</script>

<div id="app"></div>
</body> 
**/

winform.show();
win.loopMessage();

Markdown 格式