用vb.net写一个简易的RSS阅读器

先发一个做出来的效果图
用vb.net写一个简易的RSS阅读器
哈哈!怎么样?对了DUDU,我这个还解决了看天下那个阅读器不能正常显示相对路径的图片的问题哟!
现在不管相对的还是绝对的路径的图片都能正常显示哈!

下面是源代码,没有太多注释,因为都比较简单嘛!
用vb.net写一个简易的RSS阅读器Imports System.Xml
用vb.net写一个简易的RSS阅读器
Imports System.Threading
用vb.net写一个简易的RSS阅读器
用vb.net写一个简易的RSS阅读器用vb.net写一个简易的RSS阅读器
Public Class Form1Class Form1
用vb.net写一个简易的RSS阅读器    
Inherits System.Windows.Forms.Form
用vb.net写一个简易的RSS阅读器#Region 
" Windows 窗体设计器生成的代码 "
用vb.net写一个简易的RSS阅读器

用vb.net写一个简易的RSS阅读器用vb.net写一个简易的RSS阅读器
    Public Sub New()Sub New()
用vb.net写一个简易的RSS阅读器        
MyBase.New()
用vb.net写一个简易的RSS阅读器
用vb.net写一个简易的RSS阅读器        
'该调用是 Windows 窗体设计器所必需的。
用vb.net写一个简易的RSS阅读器
        InitializeComponent()
用vb.net写一个简易的RSS阅读器
用vb.net写一个简易的RSS阅读器        
'在 InitializeComponent() 调用之后添加任何初始化
用vb.net写一个简易的RSS阅读器

用vb.net写一个简易的RSS阅读器    
End Sub

用vb.net写一个简易的RSS阅读器
用vb.net写一个简易的RSS阅读器    
'窗体重写 dispose 以清理组件列表。
用vb.net写一个简易的RSS阅读器用vb.net写一个简易的RSS阅读器
    Protected Overloads Overrides Sub Dispose()Sub Dispose(ByVal disposing As Boolean)
用vb.net写一个简易的RSS阅读器        
If disposing Then
用vb.net写一个简易的RSS阅读器            
If Not (components Is NothingThen
用vb.net写一个简易的RSS阅读器                components.Dispose()
用vb.net写一个简易的RSS阅读器            
End If
用vb.net写一个简易的RSS阅读器        
End If
用vb.net写一个简易的RSS阅读器        
MyBase.Dispose(disposing)
用vb.net写一个简易的RSS阅读器    
End Sub

用vb.net写一个简易的RSS阅读器
用vb.net写一个简易的RSS阅读器    
'Windows 窗体设计器所必需的
用vb.net写一个简易的RSS阅读器
    Private components As System.ComponentModel.IContainer
用vb.net写一个简易的RSS阅读器
用vb.net写一个简易的RSS阅读器    
'注意: 以下过程是 Windows 窗体设计器所必需的
用vb.net写一个简易的RSS阅读器
    '可以使用 Windows 窗体设计器修改此过程。
用vb.net写一个简易的RSS阅读器
    '不要使用代码编辑器修改它。
用vb.net写一个简易的RSS阅读器
    Friend WithEvents ListBox1 As System.Windows.Forms.ListBox
用vb.net写一个简易的RSS阅读器    
Friend WithEvents Button1 As System.Windows.Forms.Button
用vb.net写一个简易的RSS阅读器    
Friend WithEvents AxWebBrowser1 As AxSHDocVw.AxWebBrowser
用vb.net写一个简易的RSS阅读器    
Friend WithEvents Label1 As System.Windows.Forms.Label
用vb.net写一个简易的RSS阅读器    
Friend WithEvents Label2 As System.Windows.Forms.Label
用vb.net写一个简易的RSS阅读器    
Friend WithEvents TextBox1 As System.Windows.Forms.TextBox
用vb.net写一个简易的RSS阅读器    
Friend WithEvents StatusBar1 As System.Windows.Forms.StatusBar
用vb.net写一个简易的RSS阅读器    
Friend WithEvents Label4 As System.Windows.Forms.Label
用vb.net写一个简易的RSS阅读器用vb.net写一个简易的RSS阅读器    
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()Sub InitializeComponent()
用vb.net写一个简易的RSS阅读器        
Dim resources As System.Resources.ResourceManager = New System.Resources.ResourceManager(GetType(Form1))
用vb.net写一个简易的RSS阅读器        Me.ListBox1 
= New System.Windows.Forms.ListBox
用vb.net写一个简易的RSS阅读器        Me.Button1 
= New System.Windows.Forms.Button
用vb.net写一个简易的RSS阅读器        Me.AxWebBrowser1 
= New AxSHDocVw.AxWebBrowser
用vb.net写一个简易的RSS阅读器        Me.Label1 
= New System.Windows.Forms.Label
用vb.net写一个简易的RSS阅读器        Me.Label2 
= New System.Windows.Forms.Label
用vb.net写一个简易的RSS阅读器        Me.TextBox1 
= New System.Windows.Forms.TextBox
用vb.net写一个简易的RSS阅读器        Me.StatusBar1 
= New System.Windows.Forms.StatusBar
用vb.net写一个简易的RSS阅读器        Me.Label4 
= New System.Windows.Forms.Label
用vb.net写一个简易的RSS阅读器        
CType(Me.AxWebBrowser1, System.ComponentModel.ISupportInitialize).BeginInit()
用vb.net写一个简易的RSS阅读器        Me.SuspendLayout()
用vb.net写一个简易的RSS阅读器        
'
用vb.net写一个简易的RSS阅读器
        'ListBox1
用vb.net写一个简易的RSS阅读器
        '
用vb.net写一个简易的RSS阅读器
        Me.ListBox1.ItemHeight = 12
用vb.net写一个简易的RSS阅读器        Me.ListBox1.Location 
= New System.Drawing.Point(072)
用vb.net写一个简易的RSS阅读器        Me.ListBox1.Name 
= "ListBox1"
用vb.net写一个简易的RSS阅读器
        Me.ListBox1.Size = New System.Drawing.Size(872124)
用vb.net写一个简易的RSS阅读器        Me.ListBox1.TabIndex 
= 0
用vb.net写一个简易的RSS阅读器        
'
用vb.net写一个简易的RSS阅读器
        'Button1
用vb.net写一个简易的RSS阅读器
        '
用vb.net写一个简易的RSS阅读器
        Me.Button1.Location = New System.Drawing.Point(7600)
用vb.net写一个简易的RSS阅读器        Me.Button1.Name 
= "Button1"
用vb.net写一个简易的RSS阅读器
        Me.Button1.Size = New System.Drawing.Size(11272)
用vb.net写一个简易的RSS阅读器        Me.Button1.TabIndex 
= 1
用vb.net写一个简易的RSS阅读器        Me.Button1.Text 
= "读取"
用vb.net写一个简易的RSS阅读器
        '
用vb.net写一个简易的RSS阅读器
        'AxWebBrowser1
用vb.net写一个简易的RSS阅读器
        '
用vb.net写一个简易的RSS阅读器
        Me.AxWebBrowser1.Enabled = True
用vb.net写一个简易的RSS阅读器        Me.AxWebBrowser1.Location 
= New System.Drawing.Point(0208)
用vb.net写一个简易的RSS阅读器        Me.AxWebBrowser1.OcxState 
= CType(resources.GetObject("AxWebBrowser1.OcxState"), System.Windows.Forms.AxHost.State)
用vb.net写一个简易的RSS阅读器        Me.AxWebBrowser1.Size 
= New System.Drawing.Size(872512)
用vb.net写一个简易的RSS阅读器        Me.AxWebBrowser1.TabIndex 
= 2
用vb.net写一个简易的RSS阅读器        
'
用vb.net写一个简易的RSS阅读器
        'Label1
用vb.net写一个简易的RSS阅读器
        '
用vb.net写一个简易的RSS阅读器
        Me.Label1.Location = New System.Drawing.Point(2432)
用vb.net写一个简易的RSS阅读器        Me.Label1.Name 
= "Label1"
用vb.net写一个简易的RSS阅读器
        Me.Label1.Size = New System.Drawing.Size(72816)
用vb.net写一个简易的RSS阅读器        Me.Label1.TabIndex 
= 3
用vb.net写一个简易的RSS阅读器        Me.Label1.Text 
= "网站:"
用vb.net写一个简易的RSS阅读器
        '
用vb.net写一个简易的RSS阅读器
        'Label2
用vb.net写一个简易的RSS阅读器
        '
用vb.net写一个简易的RSS阅读器
        Me.Label2.Location = New System.Drawing.Point(2448)
用vb.net写一个简易的RSS阅读器        Me.Label2.Name 
= "Label2"
用vb.net写一个简易的RSS阅读器
        Me.Label2.Size = New System.Drawing.Size(72816)
用vb.net写一个简易的RSS阅读器        Me.Label2.TabIndex 
= 4
用vb.net写一个简易的RSS阅读器        Me.Label2.Text 
= "描述:"
用vb.net写一个简易的RSS阅读器
        '
用vb.net写一个简易的RSS阅读器
        'TextBox1
用vb.net写一个简易的RSS阅读器
        '
用vb.net写一个简易的RSS阅读器
        Me.TextBox1.Location = New System.Drawing.Point(880)
用vb.net写一个简易的RSS阅读器        Me.TextBox1.Name 
= "TextBox1"
用vb.net写一个简易的RSS阅读器
        Me.TextBox1.Size = New System.Drawing.Size(66421)
用vb.net写一个简易的RSS阅读器        Me.TextBox1.TabIndex 
= 6
用vb.net写一个简易的RSS阅读器        Me.TextBox1.Text 
= "http://www.cnblogs.com/aowind/Rss.aspx"
用vb.net写一个简易的RSS阅读器
        '
用vb.net写一个简易的RSS阅读器
        'StatusBar1
用vb.net写一个简易的RSS阅读器
        '
用vb.net写一个简易的RSS阅读器
        Me.StatusBar1.Location = New System.Drawing.Point(0725)
用vb.net写一个简易的RSS阅读器        Me.StatusBar1.Name 
= "StatusBar1"
用vb.net写一个简易的RSS阅读器
        Me.StatusBar1.Size = New System.Drawing.Size(87224)
用vb.net写一个简易的RSS阅读器        Me.StatusBar1.TabIndex 
= 7
用vb.net写一个简易的RSS阅读器        Me.StatusBar1.Text 
= "StatusBar1"
用vb.net写一个简易的RSS阅读器
        '
用vb.net写一个简易的RSS阅读器
        'Label4
用vb.net写一个简易的RSS阅读器
        '
用vb.net写一个简易的RSS阅读器
        Me.Label4.Location = New System.Drawing.Point(168)
用vb.net写一个简易的RSS阅读器        Me.Label4.Name 
= "Label4"
用vb.net写一个简易的RSS阅读器
        Me.Label4.Size = New System.Drawing.Size(6416)
用vb.net写一个简易的RSS阅读器        Me.Label4.TabIndex 
= 8
用vb.net写一个简易的RSS阅读器        Me.Label4.Text 
= "RSS地址:"
用vb.net写一个简易的RSS阅读器
        '
用vb.net写一个简易的RSS阅读器
        'Form1
用vb.net写一个简易的RSS阅读器
        '
用vb.net写一个简易的RSS阅读器
        Me.AutoScaleBaseSize = New System.Drawing.Size(614)
用vb.net写一个简易的RSS阅读器        Me.ClientSize 
= New System.Drawing.Size(872749)
用vb.net写一个简易的RSS阅读器        Me.Controls.Add(Me.Label4)
用vb.net写一个简易的RSS阅读器        Me.Controls.Add(Me.StatusBar1)
用vb.net写一个简易的RSS阅读器        Me.Controls.Add(Me.TextBox1)
用vb.net写一个简易的RSS阅读器        Me.Controls.Add(Me.Label2)
用vb.net写一个简易的RSS阅读器        Me.Controls.Add(Me.Label1)
用vb.net写一个简易的RSS阅读器        Me.Controls.Add(Me.AxWebBrowser1)
用vb.net写一个简易的RSS阅读器        Me.Controls.Add(Me.Button1)
用vb.net写一个简易的RSS阅读器        Me.Controls.Add(Me.ListBox1)
用vb.net写一个简易的RSS阅读器        Me.Name 
= "Form1"
用vb.net写一个简易的RSS阅读器
        Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen
用vb.net写一个简易的RSS阅读器        Me.Text 
= "简易RSS阅读器"
用vb.net写一个简易的RSS阅读器
        CType(Me.AxWebBrowser1, System.ComponentModel.ISupportInitialize).EndInit()
用vb.net写一个简易的RSS阅读器        Me.ResumeLayout(
False)
用vb.net写一个简易的RSS阅读器
用vb.net写一个简易的RSS阅读器    
End Sub

用vb.net写一个简易的RSS阅读器
用vb.net写一个简易的RSS阅读器#
End Region
用vb.net写一个简易的RSS阅读器    
Private thread As thread '定义一个线程
用vb.net写一个简易的RSS阅读器用vb.net写一个简易的RSS阅读器
    Private Sub loadrss()Sub loadrss() '读取RSS文件并取出内容标题的过程
用vb.net写一个简易的RSS阅读器
        StatusBar1.Text = "正在读取" & TextBox1.Text & "并效验用vb.net写一个简易的RSS阅读器"
用vb.net写一个简易的RSS阅读器
        Me.loadxmltocache(TextBox1.Text)
用vb.net写一个简易的RSS阅读器        StatusBar1.Text 
= "正在读取相关网站信息用vb.net写一个简易的RSS阅读器"
用vb.net写一个简易的RSS阅读器
        Me.loadtitle()
用vb.net写一个简易的RSS阅读器        StatusBar1.Text 
= "正在读取相RSS内容项用vb.net写一个简易的RSS阅读器"
用vb.net写一个简易的RSS阅读器
        Me.loaditem()
用vb.net写一个简易的RSS阅读器        StatusBar1.Text 
= "完成"
用vb.net写一个简易的RSS阅读器
    End Sub

用vb.net写一个简易的RSS阅读器
用vb.net写一个简易的RSS阅读器用vb.net写一个简易的RSS阅读器    
Private Sub Button1_Click()Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click
用vb.net写一个简易的RSS阅读器        
Try
用vb.net写一个简易的RSS阅读器            thread 
= New Thread(AddressOf loadrss)
用vb.net写一个简易的RSS阅读器            thread.Start()
用vb.net写一个简易的RSS阅读器        
Catch ex As Exception
用vb.net写一个简易的RSS阅读器            
MsgBox(ex.ToString)
用vb.net写一个简易的RSS阅读器        
End Try
用vb.net写一个简易的RSS阅读器    
End Sub

用vb.net写一个简易的RSS阅读器
用vb.net写一个简易的RSS阅读器用vb.net写一个简易的RSS阅读器    
Private Sub Form1_Load()Sub Form1_Load(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles MyBase.Load
用vb.net写一个简易的RSS阅读器        AxWebBrowser1.Width 
= Me.Width
用vb.net写一个简易的RSS阅读器        StatusBar1.Text 
= "就绪"
用vb.net写一个简易的RSS阅读器
    End Sub

用vb.net写一个简易的RSS阅读器用vb.net写一个简易的RSS阅读器    
Private Sub loadxmltocache()Sub loadxmltocache(ByVal URL As String)
用vb.net写一个简易的RSS阅读器        
'读取RSS文件并存放在本地以供操作
用vb.net写一个简易的RSS阅读器
        Dim xmldocument As New XmlDocument
用vb.net写一个简易的RSS阅读器        xmldocument.Load(URL)
用vb.net写一个简易的RSS阅读器        xmldocument.Save(Application.StartupPath 
& "~doc.xml")
用vb.net写一个简易的RSS阅读器
用vb.net写一个简易的RSS阅读器    
End Sub

用vb.net写一个简易的RSS阅读器用vb.net写一个简易的RSS阅读器    
Private Sub loadtitle()Sub loadtitle()
用vb.net写一个简易的RSS阅读器        
'从本地文件中进行操作,读取RSS中有关网站的信息
用vb.net写一个简易的RSS阅读器
        Dim xmlDocument As New XmlDocument
用vb.net写一个简易的RSS阅读器        xmlDocument.Load(Application.StartupPath 
& "~doc.xml")
用vb.net写一个简易的RSS阅读器        
Dim mynodelist As XmlNodeList
用vb.net写一个简易的RSS阅读器        mynodelist 
= xmlDocument.SelectNodes("/rss/channel")
用vb.net写一个简易的RSS阅读器        Label1.Text 
= "网站:" & Trim(mynodelist(0).Item("title").InnerText())
用vb.net写一个简易的RSS阅读器        Label2.Text 
= "描述:" & Trim(mynodelist(0).Item("description").InnerText())
用vb.net写一个简易的RSS阅读器    
End Sub

用vb.net写一个简易的RSS阅读器用vb.net写一个简易的RSS阅读器    
Private Sub loaditem()Sub loaditem()
用vb.net写一个简易的RSS阅读器        
'从本地文件中进行操作,读取RSS中内容的标题及作者
用vb.net写一个简易的RSS阅读器
        Dim xmlDocument As New XmlDocument
用vb.net写一个简易的RSS阅读器        xmlDocument.Load(Application.StartupPath 
& "~doc.xml")
用vb.net写一个简易的RSS阅读器        
Dim mynodelist As XmlNodeList
用vb.net写一个简易的RSS阅读器        mynodelist 
= xmlDocument.SelectNodes("/rss/channel/item")
用vb.net写一个简易的RSS阅读器        ListBox1.Items.Clear()
用vb.net写一个简易的RSS阅读器        
Dim i As Integer
用vb.net写一个简易的RSS阅读器        
For i = 0 To mynodelist.Count - 1
用vb.net写一个简易的RSS阅读器            ListBox1.Items.Add(
"[" & Trim(mynodelist(i).Item("dc:creator").InnerText()) & "]" & Trim(mynodelist(i).Item("title").InnerText()))
用vb.net写一个简易的RSS阅读器        
Next
用vb.net写一个简易的RSS阅读器    
End Sub

用vb.net写一个简易的RSS阅读器
用vb.net写一个简易的RSS阅读器用vb.net写一个简易的RSS阅读器    
Private Sub ListBox1_SelectedIndexChanged()Sub ListBox1_SelectedIndexChanged(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
用vb.net写一个简易的RSS阅读器        thread 
= New Thread(AddressOf loadhtml)
用vb.net写一个简易的RSS阅读器        thread.Start()
用vb.net写一个简易的RSS阅读器    
End Sub

用vb.net写一个简易的RSS阅读器用vb.net写一个简易的RSS阅读器    
Private Sub loadhtml()Sub loadhtml()
用vb.net写一个简易的RSS阅读器        
'读取RSS中对应文件的内容并存到临时文件后显示
用vb.net写一个简易的RSS阅读器
        Dim xmlDocument As New XmlDocument
用vb.net写一个简易的RSS阅读器        xmlDocument.Load(Application.StartupPath 
& "~doc.xml")
用vb.net写一个简易的RSS阅读器        
Dim mynodelist As XmlNodeList
用vb.net写一个简易的RSS阅读器        mynodelist 
= xmlDocument.SelectNodes("/rss/channel/item")
用vb.net写一个简易的RSS阅读器        
Dim i As Integer
用vb.net写一个简易的RSS阅读器        
Dim j As Boolean
用vb.net写一个简易的RSS阅读器        
Dim content As String
用vb.net写一个简易的RSS阅读器        StatusBar1.Text 
= "正在读取文章内容用vb.net写一个简易的RSS阅读器"
用vb.net写一个简易的RSS阅读器
        For i = 0 To mynodelist.Count - 1
用vb.net写一个简易的RSS阅读器            
If ListBox1.SelectedItem = "[" & Trim(mynodelist(i).Item("dc:creator").InnerText()) & "]" & Trim(mynodelist(i).Item("title").InnerText()) Then
用vb.net写一个简易的RSS阅读器                content 
= content & "<html><head><meta http-equiv='content-type' content='text/html;charset=UTF-8'></head><body>"
用vb.net写一个简易的RSS阅读器
                content = content & "<table width='100%' height='80' bgcolor='#eeeeee'><tr><td><b>标题:</b><a href='"
用vb.net写一个简易的RSS阅读器
                content = content & Trim(mynodelist(i).Item("link").InnerText())
用vb.net写一个简易的RSS阅读器                content 
= content & "' target='_blank'>"
用vb.net写一个简易的RSS阅读器
                content = content & Trim(mynodelist(i).Item("title").InnerText())
用vb.net写一个简易的RSS阅读器                content 
= content & "</a><br><b>作者:</b>"
用vb.net写一个简易的RSS阅读器
                content = content & Trim(mynodelist(i).Item("dc:creator").InnerText())
用vb.net写一个简易的RSS阅读器                content 
= content & "</tb></tr></table>"
用vb.net写一个简易的RSS阅读器
                content = content & formatHtml(mynodelist(i).Item("description").InnerText())
用vb.net写一个简易的RSS阅读器                content 
= content & "</body></html>"
用vb.net写一个简易的RSS阅读器
                j = SaveTextFile(Application.StartupPath & "~temp.html", content)
用vb.net写一个简易的RSS阅读器                AxWebBrowser1.Navigate(Application.StartupPath 
& "~temp.html")
用vb.net写一个简易的RSS阅读器                
Exit For
用vb.net写一个简易的RSS阅读器            
End If
用vb.net写一个简易的RSS阅读器        
Next
用vb.net写一个简易的RSS阅读器        StatusBar1.Text 
= "完成"
用vb.net写一个简易的RSS阅读器
    End Sub

用vb.net写一个简易的RSS阅读器    
'写文件的过程
用vb.net写一个简易的RSS阅读器用vb.net写一个简易的RSS阅读器
    Function SaveTextFile()Function SaveTextFile(ByVal FilePath As StringByVal FileContent As StringAs Boolean
用vb.net写一个简易的RSS阅读器        
Dim sw As System.IO.StreamWriter
用vb.net写一个简易的RSS阅读器        
Try
用vb.net写一个简易的RSS阅读器            sw 
= New System.IO.StreamWriter(FilePath, False)
用vb.net写一个简易的RSS阅读器            sw.
Write(FileContent)
用vb.net写一个简易的RSS阅读器            
Return True
用vb.net写一个简易的RSS阅读器        
Catch e As Exception
用vb.net写一个简易的RSS阅读器            
Return False
用vb.net写一个简易的RSS阅读器        
Finally
用vb.net写一个简易的RSS阅读器            
If Not sw Is Nothing Then sw.Close()
用vb.net写一个简易的RSS阅读器        
End Try
用vb.net写一个简易的RSS阅读器    
End Function

用vb.net写一个简易的RSS阅读器    
'从地址里取网址的函数
用vb.net写一个简易的RSS阅读器用vb.net写一个简易的RSS阅读器
    Private Function formatURL()Function formatURL(ByVal str As StringAs String
用vb.net写一个简易的RSS阅读器        
Dim sStr As String
用vb.net写一个简易的RSS阅读器        
Dim i As Integer
用vb.net写一个简易的RSS阅读器        
Dim j As Integer
用vb.net写一个简易的RSS阅读器        
For i = 1 To Len(str)
用vb.net写一个简易的RSS阅读器            sStr 
= sStr & Mid(str, i, 1)
用vb.net写一个简易的RSS阅读器            
If Mid(str, i, 1= "/" Then
用vb.net写一个简易的RSS阅读器                j 
+= 1
用vb.net写一个简易的RSS阅读器            
End If
用vb.net写一个简易的RSS阅读器            
If j = 3 Then Exit For
用vb.net写一个简易的RSS阅读器        
Next
用vb.net写一个简易的RSS阅读器        
Return sStr
用vb.net写一个简易的RSS阅读器    
End Function

用vb.net写一个简易的RSS阅读器    
'将内容里的相对图片地址改成绝对地址的函数
用vb.net写一个简易的RSS阅读器用vb.net写一个简易的RSS阅读器
    Private Function formatHtml()Function formatHtml(ByVal str As StringAs String
用vb.net写一个简易的RSS阅读器        
Return Replace(str"src=" & Chr(34& "/""src =" & Chr(34& formatURL(TextBox1.Text))
用vb.net写一个简易的RSS阅读器    
End Function

用vb.net写一个简易的RSS阅读器
End Class

当然还有好多功能没完成,比如收藏RSS地址、是否已读、自动更新。
所以叫简易RSS阅读器嘛!参考一下!
上一篇:【转】超实用的买基金攻略,看这一篇就够了


下一篇:5、客户负责人指南 - 软件项目角色指南系列文章