zoukankan      html  css  js  c++  java
  • C#操作PowerDesigner代码

    首先,程序的界面如下:

    这里一定要使用OpenFileDialog控件,然后该页面代码如下:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Xml;
    
    namespace DBDesign
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                this.openFileDialog1.Filter = "pdm文件(*.pdm)|*.pdm";
                this.openFileDialog1.Multiselect = false;
    
                if (this.openFileDialog1.ShowDialog() == DialogResult.OK) 
                {
                    this.label2.Text = this.openFileDialog1.FileName;
                }
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                try
                {
                    PdmReader mTest = new PdmReader(this.label2.Text);
                    Form2 f2 = new Form2(mTest, this.label2.Text);
                    f2.Show();
                    this.Visible = false;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
    
            private void Form1_FormClosed(object sender, FormClosedEventArgs e)
            {
                Application.Exit();
            }
        }
    }

    然后第二个页面界面如下:

    这个界面的代码如下:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.IO;
    using System.Windows.Forms;
    using Microsoft.Office.Interop.Excel;
    
    namespace DBDesign
    {
        public partial class Form2 : Form
        {
            private PdmReader pr = new PdmReader();
    
            private string path = string.Empty;
    
            public Form2(PdmReader pr, string path)
            {
                InitializeComponent();
    
                this.pr = pr;
                this.path = path;
            }
    
            private void Form2_Load(object sender, EventArgs e)
            {
                pr.InitData();
    
                this.dataGridView1.AutoGenerateColumns = false;
                this.dataGridView1.DataSource = pr.Tables;
    
                string[] names = null;
                List<string> hms = new List<string>();
                List<string> res = null;
                for (int i = 0; names != null && i < names.Length; i++) 
                {
                    string[] str = names[i].Split(new char[] { '!' }, StringSplitOptions.RemoveEmptyEntries);
                    res = hms.FindAll(M => M.Equals(str[0].Substring(24)));
                    if (!(res != null && res.Count > 0)) 
                    {
                        hms.Add(str[0].Substring(24));
                    }
                }
                foreach (string s in hms) 
                {
                    this.comboBox1.Items.Add(s);
                }
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                this.Visible = false;
                Form1 f1 = new Form1();
                f1.Show();
            }
    
            private void Form2_FormClosed(object sender, FormClosedEventArgs e)
            {
                System.Windows.Forms.Application.Exit();
            }
    
            private void button3_Click(object sender, EventArgs e)
            {
                if (this.comboBox1.SelectedItem != null && !this.comboBox1.SelectedItem.Equals("")) 
                {
                    FileInfo file = new FileInfo(path);
                    if (!Directory.Exists("D:\work\Test\XML\" + file.Name.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries)[0])) 
                    {
                        Directory.CreateDirectory("D:\work\Test\XML\" + file.Name.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries)[0]);
                    }
                    if (Directory.Exists("D:\work\Test\XML\" + file.Name.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries)[0] + "\" + this.comboBox1.SelectedItem.ToString() + ".txt")) 
                    {
                        File.Delete("D:\work\Test\XML\" + file.Name.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries)[0] + "\" + this.comboBox1.SelectedItem.ToString() + ".txt");
                    }
                    string str = string.Empty;
                    foreach (DataGridViewRow dr in this.dataGridView1.Rows) 
                    {
                        if (dr.Cells[0].Value != null && int.Parse(dr.Cells[0].Value.ToString()) == 1)   
                        {
                            str += dr.Cells[1].Value.ToString() + "|";
                        }
                    }
                    if (str.Length > 0) 
                    {
                        str = str.Substring(0, str.Length - 1);
                    }
                    FileStream fs = new FileStream("D:\work\Test\XML\" + file.Name.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries)[0] + "\" + this.comboBox1.SelectedItem.ToString() + ".txt", FileMode.Create);
                    StreamWriter sw = new StreamWriter(fs);
                    sw.Write(str);
                    sw.Flush();
                    sw.Close();
                    fs.Close();
                }
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                int n = 1;
                FileInfo file = new FileInfo(path);
                Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.ApplicationClass();
                app.Visible = false;
                Workbook wb = app.Workbooks.Add(true);
                Worksheet ws = (Worksheet)wb.ActiveSheet;
                ws.Name = "所有表";
                ((Microsoft.Office.Interop.Excel.Range)ws.Columns["B", Type.Missing]).ColumnWidth = 25.50;
                ((Microsoft.Office.Interop.Excel.Range)ws.Columns["A", Type.Missing]).HorizontalAlignment = Microsoft.Office.Interop.Excel.XlVAlign.xlVAlignCenter;
                ((Microsoft.Office.Interop.Excel.Range)ws.Columns["E", Type.Missing]).HorizontalAlignment = Microsoft.Office.Interop.Excel.XlVAlign.xlVAlignCenter;
                ((Microsoft.Office.Interop.Excel.Range)ws.Columns["F", Type.Missing]).HorizontalAlignment = Microsoft.Office.Interop.Excel.XlVAlign.xlVAlignCenter;
                ((Microsoft.Office.Interop.Excel.Range)ws.Columns["C", Type.Missing]).ColumnWidth = 43.50;
                ((Microsoft.Office.Interop.Excel.Range)ws.Columns["D", Type.Missing]).ColumnWidth = 10.00;
                ((Microsoft.Office.Interop.Excel.Range)ws.Columns["E", Type.Missing]).ColumnWidth = 8.50;
                ((Microsoft.Office.Interop.Excel.Range)ws.Columns["F", Type.Missing]).ColumnWidth = 8.50;
                Range r = ws.get_Range(ws.Cells[1,1],ws.Cells[1,6]);
                r.Interior.ColorIndex = 37;
                r.Font.Size = 12;
                r.Font.Bold = true;
                Borders borders = r.Borders;
                borders.LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous;
                ws.Cells[n, 1] = "序号";
                ws.Cells[n, 2] = "表名";
                ws.Cells[n, 3] = "表说明";
                ws.Cells[n, 4] = "字段类型";
                ws.Cells[n, 5] = "长度";
                ws.Cells[n, 6] = "允许空";
    
                n = 2;
    
                List<string> list = new List<string>();
                for (int i = 0; i < this.dataGridView1.Rows.Count; i++)
                {
                    DataGridViewRow dr = this.dataGridView1.Rows[i];
                    string str = dr.Cells[1].Value.ToString();
                    if (dr.Cells["cbxTable"].Value != null && dr.Cells["cbxTable"].Value.ToString().Equals("1")) 
                    {
                        list.Add(dr.Cells[1].Value.ToString());
                    }
                }
    
                foreach (TableInfo table in pr.Tables) 
                {
                    bool print = false;
                    if (this.checkBox1.Checked)
                    {
                        print = true;
                    }
                    else 
                    {
                        foreach (string s in list) 
                        {
                            if (s.Equals(table.Code)) 
                            {
                                print = true;
                            }
                        }
                    }
                    if (print) 
                    {
                        Range rt = ws.get_Range(ws.Cells[n, 1], ws.Cells[n, 6]);
                        rt.Interior.ColorIndex = 35;
                        rt.Font.Size = 12;
                        Borders border = rt.Borders;
                        border.LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous;
                        ws.Cells[n, 1] = "T";
                        ws.Cells[n, 2] = table.Code;
                        ws.Cells[n, 3] = table.Comment;
                        ws.Cells[n, 4] = "";
                        ws.Cells[n, 5] = "";
                        ws.Cells[n, 6] = "";
    
                        n = n + 1;
    
                        for (int i = 0; i < table.Columns.Count; i++)
                        {
                            Range rtc = ws.get_Range(ws.Cells[n, 1], ws.Cells[n, 6]);
                            rtc.Font.Size = 12;
                            Borders borderc = rtc.Borders;
                            borderc.LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous;
                            ws.Cells[n, 1] = i + 1;
                            ws.Cells[n, 2] = table.Columns[i].Code;
                            ws.Cells[n, 3] = table.Columns[i].Comment;
                            ws.Cells[n, 4] = table.Columns[i].DataType.Contains("(") ? table.Columns[i].DataType.Split(new char[] { '(' }, StringSplitOptions.RemoveEmptyEntries)[0] : table.Columns[i].DataType;
                            if (table.Columns[i].DataType.Equals("int"))
                            {
                                ws.Cells[n, 5] = 10;
                            }
                            else if (table.Columns[i].DataType.Equals("datetime"))
                            {
                                ws.Cells[n, 5] = 23;
                            }
                            else
                            {
                                ws.Cells[n, 5] = table.Columns[i].Length;
                            }
                            ws.Cells[n, 6] = table.Columns[i].Mandatory ? "" : "";
    
                            if (table.Primary != null) 
                            {
                                foreach (string pk in table.Primary)
                                {
                                    if (pk.Equals(table.Columns[i].ColumnId))
                                    {
                                        rtc.Interior.ColorIndex = 6;
                                    }
                                }
                            }
    
                            n = n + 1;
                        }
                    }
                }
    
                wb.Saved = true;
                app.ActiveWorkbook.SaveCopyAs("D:\Test.xlsx");
                MessageBox.Show("over!");
            }
        }
    }

    然后这里还用到了四个别的类,分别列举一下:

    1.TableInfo.cs

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace DBDesign
    {
        //表信息
        public class TableInfo
        {
            public TableInfo()
            {
            }
            string tableId;
    
            public string TableId
            {
                get { return tableId; }
                set { tableId = value; }
            }
            string objectID;
    
            public string ObjectID
            {
                get { return objectID; }
                set { objectID = value; }
            }
            string name;
    
            public string Name
            {
                get { return name; }
                set { name = value; }
            }
            string code;
    
            public string Code
            {
                get { return code; }
                set { code = value; }
            }
            int creationDate;
    
            public int CreationDate
            {
                get { return creationDate; }
                set { creationDate = value; }
            }
            string creator;
    
            public string Creator
            {
                get { return creator; }
                set { creator = value; }
            }
            int modificationDate;
    
            public int ModificationDate
            {
                get { return modificationDate; }
                set { modificationDate = value; }
            }
            string modifier;
    
            public string Modifier
            {
                get { return modifier; }
                set { modifier = value; }
            }
            string comment;
    
            public string Comment
            {
                get { return comment; }
                set { comment = value; }
            }
    
            string physicalOptions;
    
            public string PhysicalOptions
            {
                get { return physicalOptions; }
                set { physicalOptions = value; }
            }
    
    
            IList<ColumnInfo> columns;
    
            public IList<ColumnInfo> Columns
            {
                get { return columns; }
            }
    
            IList<PdmKey> keys;
    
            public IList<PdmKey> Keys
            {
                get { return keys; }
            }
    
            IList<string> primary;
    
            public IList<string> Primary
            {
                get { return primary; }
                set { primary = value; }
            }
    
            public void AddColumn(ColumnInfo mColumn)
            {
                if (columns == null)
                    columns = new List<ColumnInfo>();
                columns.Add(mColumn);
            }
    
            public void AddKey(PdmKey mKey)
            {
                if (keys == null)
                    keys = new List<PdmKey>();
                keys.Add(mKey);
            }
    
            public void AddPrimary(string id) 
            {
                if (primary == null)
                    primary = new List<string>();
                primary.Add(id);
            }
        }
    
    }

    2.PdmReader.cs

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Xml;
    
    namespace DBDesign
    {
        public class PdmReader
        {
            public const string a = "attribute", c = "collection", o = "object";
    
            public const string cClasses = "c:Classes";
            public const string oClass = "o:Class";
    
            public const string cAttributes = "c:Attributes";
            public const string oAttribute = "o:Attribute";
    
            public const string cTables = "c:Tables";
            public const string oTable = "o:Table";
    
            public const string cColumns = "c:Columns";
            public const string oColumn = "o:Column";
    
    
            XmlDocument xmlDoc;
            XmlNamespaceManager xmlnsManager;
            /// <summary>构造函数 </summary>
            public PdmReader()
            {
                // TODO: 在此处添加构造函数逻辑
                xmlDoc = new XmlDocument();
            }
            /// <summary>构造函数 </summary>
            public PdmReader(string pdm_file)
            {
                PdmFile = pdm_file;
            }
    
            string pdmFile;
    
            public string PdmFile
            {
                get { return pdmFile; }
                set
                {
                    pdmFile = value;
                    if (xmlDoc == null)
                    {
                        xmlDoc = new XmlDocument();
                        xmlDoc.Load(pdmFile);
                        xmlnsManager = new XmlNamespaceManager(xmlDoc.NameTable);
                        xmlnsManager.AddNamespace("a", "attribute");
                        xmlnsManager.AddNamespace("c", "collection");
                        xmlnsManager.AddNamespace("o", "object");
                    }
                }
            }
    
            IList<TableInfo> tables;
    
            public IList<TableInfo> Tables
            {
                get { return tables; }
                set { tables = value; }
            }
    
            public void InitData()
            {
                if (Tables == null)
                    Tables = new List<TableInfo>();
                XmlNode xnTables = xmlDoc.SelectSingleNode("//" + cTables, xmlnsManager);
                foreach (XmlNode xnTable in xnTables.ChildNodes)
                {
                    Tables.Add(GetTable(xnTable));
                }
            }
    
            //初始化"o:Table"的节点
            private TableInfo GetTable(XmlNode xnTable)
            {
                TableInfo mTable = new TableInfo();
                XmlElement xe = (XmlElement)xnTable;
                mTable.TableId = xe.GetAttribute("Id");
                XmlNodeList xnTProperty = xe.ChildNodes;
                foreach (XmlNode xnP in xnTProperty)
                {
                    switch (xnP.Name)
                    {
                        case "a:ObjectID": mTable.ObjectID = xnP.InnerText;
                            break;
                        case "a:Name": mTable.Name = xnP.InnerText;
                            break;
                        case "a:Code": mTable.Code = xnP.InnerText;
                            break;
                        case "a:CreationDate": mTable.CreationDate = Convert.ToInt32(xnP.InnerText);
                            break;
                        case "a:Creator": mTable.Creator = xnP.InnerText;
                            break;
                        case "a:ModificationDate": mTable.ModificationDate = Convert.ToInt32(xnP.InnerText);
                            break;
                        case "a:Modifier": mTable.Modifier = xnP.InnerText;
                            break;
                        case "a:Comment": mTable.Comment = xnP.InnerText;
                            break;
                        case "a:PhysicalOptions": mTable.PhysicalOptions = xnP.InnerText;
                            break;
                        case "c:Columns": InitColumns(xnP, mTable);
                            break;
                        case "c:Keys": InitKeys(xnP, mTable);
                            break;
                        case "c:PrimaryKey": InitPrimary(xnP, mTable);
                            break;
                    }
                }
                return mTable;
            }
            //初始化"c:Columns"的节点
            private void InitColumns(XmlNode xnColumns, TableInfo pTable)
            {
                foreach (XmlNode xnColumn in xnColumns)
                {
                    pTable.AddColumn(GetColumn(xnColumn));
                }
            }
    
            //初始化c:Keys"的节点
            private void InitKeys(XmlNode xnKeys, TableInfo pTable)
            {
                foreach (XmlNode xnKey in xnKeys)
                {
                    pTable.AddKey(GetKey(xnKey));
                }
            }
    
            //初始化c:PrimaryKey的节点
            private void InitPrimary(XmlNode xnKeys, TableInfo pTable) 
            {
                foreach (XmlNode xnKey in xnKeys)
                {
                    PdmKey key = GetPrimary(xnKey);
                    foreach (PdmKey pk in pTable.Keys) 
                    {
                        if (pk.KeyId.Equals(key.KeyId)) 
                        {
                            foreach (ColumnInfo ci in pk.Columns) 
                            {
                                pTable.AddPrimary(ci.ColumnId);
                            }
                        }
                    }
                }
            }
    
            private ColumnInfo GetColumn(XmlNode xnColumn)
            {
                ColumnInfo mColumn = new ColumnInfo();
                XmlElement xe = (XmlElement)xnColumn;
                mColumn.ColumnId = xe.GetAttribute("Id");
                XmlNodeList xnCProperty = xe.ChildNodes;
                foreach (XmlNode xnP in xnCProperty)
                {
                    switch (xnP.Name)
                    {
                        case "a:ObjectID": mColumn.ObjectID = xnP.InnerText;
                            break;
                        case "a:Name": mColumn.Name = xnP.InnerText;
                            break;
                        case "a:Code": mColumn.Code = xnP.InnerText;
                            break;
                        case "a:CreationDate": mColumn.CreationDate = Convert.ToInt32(xnP.InnerText);
                            break;
                        case "a:Creator": mColumn.Creator = xnP.InnerText;
                            break;
                        case "a:ModificationDate": mColumn.ModificationDate = Convert.ToInt32(xnP.InnerText);
                            break;
                        case "a:Modifier": mColumn.Modifier = xnP.InnerText;
                            break;
                        case "a:Comment": mColumn.Comment = xnP.InnerText;
                            break;
                        case "a:DataType": mColumn.DataType = xnP.InnerText;
                            break;
                        case "a:Length": mColumn.Length = xnP.InnerText;
                            break;
                        case "a:Identity": mColumn.Identity = xnP.InnerText.Equals("Yes") ? true : false;
                            break;
                        case "a:Mandatory": mColumn.Mandatory = xnP.InnerText.Equals("1") ? true : false;
                            break;
                        case "a:PhysicalOptions": mColumn.PhysicalOptions = xnP.InnerText;
                            break;
                        case "a:ExtendedAttributesText": mColumn.ExtendedAttributesText = xnP.InnerText;
                            break;
                    }
                }
                return mColumn;
            }
    
            private PdmKey GetKey(XmlNode xnKey)
            {
                PdmKey mKey = new PdmKey();
                XmlElement xe = (XmlElement)xnKey;
                mKey.KeyId = xe.GetAttribute("Id");
                XmlNodeList xnKProperty = xe.ChildNodes;
                foreach (XmlNode xnP in xnKProperty)
                {
                    switch (xnP.Name)
                    {
                        case "a:ObjectID": mKey.ObjectID = xnP.InnerText;
                            break;
                        case "a:Name": mKey.Name = xnP.InnerText;
                            break;
                        case "a:Code": mKey.Code = xnP.InnerText;
                            break;
                        case "a:CreationDate": mKey.CreationDate = Convert.ToInt32(xnP.InnerText);
                            break;
                        case "a:Creator": mKey.Creator = xnP.InnerText;
                            break;
                        case "a:ModificationDate": mKey.ModificationDate = Convert.ToInt32(xnP.InnerText);
                            break;
                        case "a:Modifier": mKey.Modifier = xnP.InnerText;
                            break;
                        //还差 <c:Key.Columns>
                        case "c:Key.Columns": GetKeyColumn(xnP, mKey);
                            break;
                    }
                }
                return mKey;
            }
    
            public void GetKeyColumn(XmlNode xnP ,PdmKey mKey) 
            {
                XmlElement xe = (XmlElement)xnP;
                XmlNodeList nodeList = xe.ChildNodes;
                foreach (XmlNode node in nodeList) 
                {
                    ColumnInfo ci = new ColumnInfo();
                    ci.ColumnId = ((XmlElement)node).GetAttribute("Ref");
                    mKey.AddColumn(ci);
                }
            }
    
            private PdmKey GetPrimary(XmlNode xnKey) 
            {
                PdmKey mKey = new PdmKey();
                XmlElement xe = (XmlElement)xnKey;
                mKey.KeyId = xe.GetAttribute("Ref");
                return mKey;
            }
        }
    
    }

    3.PdmKey.cs

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace DBDesign
    {
        public class PdmKey
        {
            public PdmKey()
            {
            }
    
            string keyId;
    
            public string KeyId
            {
                get { return keyId; }
                set { keyId = value; }
            }
            string objectID;
    
            public string ObjectID
            {
                get { return objectID; }
                set { objectID = value; }
            }
            string name;
    
            public string Name
            {
                get { return name; }
                set { name = value; }
            }
            string code;
    
            public string Code
            {
                get { return code; }
                set { code = value; }
            }
            int creationDate;
    
            public int CreationDate
            {
                get { return creationDate; }
                set { creationDate = value; }
            }
            string creator;
    
            public string Creator
            {
                get { return creator; }
                set { creator = value; }
            }
            int modificationDate;
    
            public int ModificationDate
            {
                get { return modificationDate; }
                set { modificationDate = value; }
            }
            string modifier;
    
            public string Modifier
            {
                get { return modifier; }
                set { modifier = value; }
            }
    
            IList<ColumnInfo> columns;
    
            public IList<ColumnInfo> Columns
            {
                get { return columns; }
            }
    
            public void AddColumn(ColumnInfo mColumn)
            {
                if (columns == null)
                    columns = new List<ColumnInfo>();
                columns.Add(mColumn);
            }
        }
    
    }

    4.ColumnInfo.cs

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace DBDesign
    {
        public class ColumnInfo
        {
            public ColumnInfo()
            { }
    
            string columnId;
    
            public string ColumnId
            {
                get { return columnId; }
                set { columnId = value; }
            }
            string objectID;
    
            public string ObjectID
            {
                get { return objectID; }
                set { objectID = value; }
            }
            string name;
    
            public string Name
            {
                get { return name; }
                set { name = value; }
            }
            string code;
    
            public string Code
            {
                get { return code; }
                set { code = value; }
            }
            int creationDate;
    
            public int CreationDate
            {
                get { return creationDate; }
                set { creationDate = value; }
            }
            string creator;
    
            public string Creator
            {
                get { return creator; }
                set { creator = value; }
            }
            int modificationDate;
    
            public int ModificationDate
            {
                get { return modificationDate; }
                set { modificationDate = value; }
            }
            string modifier;
    
            public string Modifier
            {
                get { return modifier; }
                set { modifier = value; }
            }
            string comment;
    
            public string Comment
            {
                get { return comment; }
                set { comment = value; }
            }
            string dataType;
    
            public string DataType
            {
                get { return dataType; }
                set { dataType = value; }
            }
            string length;
    
            public string Length
            {
                get { return length; }
                set { length = value; }
            }
            //是否自增量
            bool identity;
    
            public bool Identity
            {
                get { return identity; }
                set { identity = value; }
            }
            bool mandatory;
            //禁止为空
            public bool Mandatory
            {
                get { return mandatory; }
                set { mandatory = value; }
            }
            string extendedAttributesText;
            //扩展属性
            public string ExtendedAttributesText
            {
                get { return extendedAttributesText; }
                set { extendedAttributesText = value; }
            }
            string physicalOptions;
    
            public string PhysicalOptions
            {
                get { return physicalOptions; }
                set { physicalOptions = value; }
            }
        }
    
    }
  • 相关阅读:
    UVALive 5983 MAGRID DP
    2015暑假训练(UVALive 5983
    poj 1426 Find The Multiple (BFS)
    poj 3126 Prime Path (BFS)
    poj 2251 Dungeon Master 3维bfs(水水)
    poj 3278 catch that cow BFS(基础水)
    poj3083 Children of the Candy Corn BFS&&DFS
    BZOJ1878: [SDOI2009]HH的项链 (离线查询+树状数组)
    洛谷P3178 [HAOI2015]树上操作(dfs序+线段树)
    洛谷P3065 [USACO12DEC]第一!First!(Trie树+拓扑排序)
  • 原文地址:https://www.cnblogs.com/wpcnblog/p/3769583.html
Copyright © 2011-2022 走看看