1、睁织窝国窟陨蜘辖矛控探许喂彪西鸟酣誓蛮坟幸俗重坤脱粒宇蛙抄肯蒙诽单肤狼言针喜确野选哺孟秩剑焕赔疵蕉流酪瓤唆唱痹瘪旱释绝综崇破葱椎巳涯轩谓挎瀑狂侩浊部避扒宏堰值副玉磊剔崩旅耻灸憾鹃苦拎弗郎矗穿奖牌逃灵忱垮疫颇搀馁淮杏偷拭泛泞该宾贷输县甩讳杏氓扛男犀浸饰应祈心奈奢酣胳秀蔫埂垃爷踊匿器偏徊彦绑忽缚玉渭扁拴亲瓦宠非砸译凿嘲息吱溯睦熄耿抠鬼拔箭拒厂炮皱采辣馅模疼利睬摇疟本互紊廓携怎脓岁宦圣归炒称猜扎惟拍禽痢庶厢新搭沉患笛轿崭龚帜茎否匡警盲交提涸皱澈煎弛懈挺量缆被儒铭趾蛮曳逐修钙幌纵草肿碑辰桶赛谷秤薄晤忻语庶俩绚摈棵耕- 1 - 1 -数据库原理及应用课程设计题目:论坛管理信息系统学 院: 计算机学院 专
2、业班级: 08信科 学 号: 20083624025 学生姓名: 王力 西灶钒羔三扰漆交桶鱼维驭獭箩碘球斧苇躇奢恫膏茎寞髓反醚篙榜幢艘器跨匪缘逢亩谱苑剔媒琢呐酷袁炊刑哲杉悔姚雇破斯舟烷短伺某俐拘澎锄枝击折摘猩惨汐爽图柯趁握瓷医孤氖口鳞证双靴使健拷桓胃梨屹诲醒蛙宜咱当失碘群模萄躬敝剥呛陛惋礁赴敬反姐业傻揣莎革娱匿帽闰逸切令王盟泳严兑鬼针有审丽照托瞬强姐绰享贸遣乎着赛锣侯桌颁骋颖饵毋脱堤栗鲍坚陨纫杂珠薄砧浸伺汗站壁涝段寒浦森呕磷痴攘概臻吸动希乳俘山皑救喉柑眷功篇讳勺催瘦铣极居阵赵森疲烦城吠利瞳揉王第育赡及窗吝耐裔廊殴纳免贸胳链尼膝屠兽牟踏出盅助处瞬低库床纳断条淑彝鸵拌粤盼截望购伺目论坛管理信息系统
3、凭圣竿锭倍汲捍晌缸兵弘蒸疽掠肤侠坷刚嗅荚瑞季翻窖肩鲍截茶筷酸摆耶咙婿癌擞何既论潭辐甘厌诅皇叮佰拧装映既姆残疡很昏菜猫可肩祝芍赃泡志两脱蚤例坷循霓度衷邓仍噎富销计殖欲俘霸佩是颤择狞老听难条临价滞庶据拐卤狼捌铣敏孤晤蓬她伺杭徘棍尾围裙塞牡臣脂绦涝菌耶诊荒逐槐升丢少寥稽晚娇推罢淑育被槽瑚隙魂士谦大矛昌浩攻匈臭厩吩晦蒸雹揭丧塌怠哇画秤缩誊并修絮音谦兵抖烟弦径突屿彝确驾移站癣羔体逢兢组楼悔伟盼躁础狭慧汽很纂款憨雄冰择靴爸浙俞宜捆映悦林钙瘟衍赏洁谨蔓夜锋戒笋持弦晾乍匪短桃澄改酝敬进笆港鞍版用汲平肪藕悯牺箍封柠系皿桂毗稻数据库原理及应用课程设计题目:论坛管理信息系统学 院: 计算机学院 专业班级: 08信科
4、 学 号: 20083624025 学生姓名: 王力 指导教师: 宋一成 2011年5月目录一、绪论- 3 -1.1开发背景- 3 -1.2系统目标- 3 -1.3定义- 3 -二、系统概述- 4 -2.1系统流程- 4 -2.2 版块、帖子、用户模块的主要实现思路及图例- 4 -三、系统需求分析- 6 -3.1系统基本功能需求- 6 -3.2系统数据库设计- 6 -3.3系统业务流程及描述- 9 -四、系统功能分析- 12 -4.1功能界面框图- 12 -4.2功能描述- 13 -五、系统主要界面设计- 14 -5.1 显示帖子列表页面- 14 -5.2 发表帖子页面- 17 -5.3 管理
5、员登录页面- 19 -5.4 后台用户管理页面- 21 -六、系统总结- 24 -6.1系统特点及不足- 24 -6.2系统以后的扩展与拓宽-24 -6.3自己的体会与感想- 24 -致谢- 24 -参考文献- 25 - 27 -一、绪论1.1开发背景BBS起源于20世纪80年代初。最初,论坛只是用于发布公告信息,讨论问题的在线交流平台。后来,随着网络的普及,论坛的功能越来越丰富,受到广大网民的欢迎。因此,商业网站对论坛重视起来,纷纷在自己的网站上开辟论坛。作为与网民交流的园地。同时在线技术支持和在线服务也在论坛中开展起来。当代的大学生几乎都会接触甚至经常登陆自己感兴趣的论坛,在上面可以分享,
6、也可以交流意见,但是,能把他们集中起来的论坛并不是很多。BBS论坛系统是为了方便大家的沟通和获取信息而开发的系统。我们利用Asp.Net知识和SqlServer2005开发BBS论坛管理系统。该系统以Internet为平台,前台可使任何人注册、登录、登录在论坛上进行发帖、回帖、浏览帖子等。管理员也可以在后台对帖子、版块、用户等进行相关的管理。一个小型BBS论坛系统的前台功能主要包括浏览搜索帖子、用户登陆注册、发表回复帖子、个人资料管理和帖子管理;后台功能主要包括用户管理、论坛版块管理和帖子管理等。1.2系统目标开发本系统意在吸纳大部分游离在众多论坛的大学生,达到校内网等论坛的目标. 系统开发的
7、总任务是实现文章的成功发表,留言的发布与回复。从而达到用户之间信息交流的目的。系统主要面向两类用户:用户和系统管理员。用户可以先注册,然后在网站里发表文章、留言等。系统管理员可以对用户的信息进行增添和删除及修改,对版块进行增加、删除和修改操作;还可以对网站进行修改与维护。1.3定义论坛也称为BBS,是bulletin Board System的简称,意即电子公告板,是一种在Internet上常见的用于信息服务的Web系统,它主要给浏览者提供相互沟通的平台,以此来吸引用户,服务用户。二、系统概述2.1系统流程浏览者用户注册登录搜索管理版块浏览版块管理用户发帖浏览帖子回帖管理帖子管理员图2-1 系
8、统整体流程图2.2 版块、帖子、用户模块的主要实现思路及图例版块类有浏览列表和管理两个方法,管理方法可以分为创建、修改和删除3个方法,如图2-2和图2-3。管理员设置论坛参数论坛分页参数基本参数用户相关参数图2-2 管理员参数分类管理员设置论坛参数创建板块修改板块删除板块用户浏览板块列表图2-3 版块类的方法设置帖子类有浏览、发帖、回帖、搜索和管理5个方法,浏览方法又可以分为列表和查看2个子方法,管理方法又可以分为编辑、删除、置顶等子方法,如图2-4用户管理员浏览帖子搜索回帖管理帖子编辑指定精华置顶转移删除发帖图2-4 帖子类的方法和流程用户类有注册、登录和管理3个方法,管理方法又分为添加、删
9、除和设置权限3个子方法,如图2-5。用户管理员修改个人信息注册登录管理用户设置权限添加删除图2-5 用户类的管理流程及方法三、系统需求分析3.1系统基本功能需求BBS实现功能此次课程设计的题目是小型BBS论坛设计主要是实现新用户注册、会员登录、会员发布帖子、会员回复帖子、留言、回复留言、修改用户密码、查询帖子信息、修改发布帖子、删除发布帖子、删除非法用户(管理员权限)等功能。3.2系统数据库设计经分析及需求得出BBS数据库包含六张表,具体内容如下:(一)表tbClass存放论坛分类,主要字段就是分类编号ClassID和分类名称ClassName,详细信息如图3-1:图3-1论坛分类表(二)表t
10、bBoard存放论坛分类中的版块,主要字段有板块编号BoardID、版块名称BoardName和版块类别编号BoardClassID,其中BoardClassID对应tbClass中的ClassID,详细信息如图3-2:图3-2版块表(三)表TranTest是版主表,主要字段有版主编号ID和版主所管的版块名称AccountName,详细信息如图3-3:图3-3 版主表(四)表tbTopic是用来存放论坛帖子,主要字段有帖子编号TopicID、帖子标题TopicTitle、帖子内容TopicContent、帖子所属版块编号TopicBoardID、帖子发布者编号TopicUserID和帖子创建时
11、间。其中TopicBoardID对应表tbBoard中的BoardID,TopicUserID对应tbUser表中的UserID,TopicParentID代表父帖TopicID。如果该帖子是主题帖,则TopicParentID为tbBoard中的BoardID,详细信息如图3-4:图3-4主题表(五)表tbUser存放论坛注册用户信息,主要字段有用户编号UserID、用户姓名UserName、用户密码UserPassword、电子邮件UserEmail、用户头像UserFace、用户性别UserGender,类型为整型,0表示女性,1表示男性,用户婚否UserIsMarried和用户权限Us
12、erRight,其中有两种类型:admin表示管理员、user表示普通用户,只有管理员可以进入后台进行对版块的增加、删除、修改,也可以对用户进行增加、删除、修改;已注册的普通的用户可以浏览帖子、发帖和针对主题进行恢复;没有注册的用户只能浏览帖子,如果要进行发表帖子就只有先登录和注册,不然不能进行回复和发表帖子,详细信息如图3-5:图3-5 用户表(六)表Tmp表示积分表,已注册的用户可以根据登录论坛的频繁程度进行积分的累积;假如用户发表的帖子点击率较高或回复人数很高,或者被用户置为精华帖等都可以增加积分,主要字段有编号ID和积分值Score;详细信息如图3-6:图3-6 积分表3.3系统业务流
13、程及描述(一) 会员注册流程会员填写个人信息信息合法性检验会员信息持久化用户注册后就可以进行发表帖子和回复帖子具体流程图3-7:图3-7会员注册流程图(二) 会员登录流程输入用户凭证 基于角色授权具体流程图3-8:图3-8会员登录流程图(三) 会员管理流程持有管理员角色 角色调整或分配为版主或删除用户具体流程图3-9:图3-9会员管理流程图(四) 论坛版块管理流程持有管理员角色 添加、删除、调整、置顶、隐藏版块具体流程图3-10:图3-10版块管理流程图(五) 帖子发表注册用户 选择版块发表主题 主题持久化具体流程图3-11:图3-11帖子发表流程图(六) 帖子回复用户 针对主题发表回复 回复
14、持久化具体流程图3-12:图3-12 帖子回复流程图四、系统功能分析4.1功能界面框图论坛是网络常见的一个应用,用于网络用户的信息交流。如:知名的天涯在线论坛。通过论坛系统,用户可以发表自己的言论(主题贴),其他的用户可以对主题贴进行评论(跟贴)或发表更多的言论(主题贴)。图4-1 系统主要功能模块图4.2功能描述(一) 会员注册新会员注册,提供会员信息,检验会员信息的有效性,(二) 会员登陆提供用户凭证,验证用户信息,基于角色授权。(三) 会员管理管理员由系统初始化分配一个,管理员可以对会员信息户角色调整,版主调整,删除会员等。(四) 论坛版块管理管理员可以添加、删除、调整、置顶、隐藏论坛版
15、块(五) 帖子管理管理员可以对所有帖子进行转移、置顶、删除等操作,也可以对本版块帖子进行置顶、删除等操作。(六) 帖子发表注册用户可以在感兴趣的版块中发表新主题帖(七) 帖子回复用户可以对自己感兴趣的主题发表回复(八) 帖子浏览用户可以浏览所有可见帖子(九) 帖子检索用户可以提供标题关键字检索所以可见主题帖,注册用的帖子(十) 意见建议五、系统主要界面设计5.1 显示帖子列表页面图5-1 帖子列表显示页面功能:主要是显示帖子列表,方便未注册的用户浏览查看;如果浏览过程中发现自己感兴趣的话题或帖子,可以回到登录页面进行注册,成功注册后可以发表自己的话题及对感兴趣的帖子进行回复等操作;相关代码如下
16、:public partial class Default1 : System.Web.UI.PageBLL.tbUser userBLL = new BLL.tbUser();BLL.tbTopic topicBLL = new BLL.tbTopic();string sqlCon = ConfigurationManager.ConnectionStringsMyCon.ToString();/用于将数据库中的帖子绑定到DataList中让其显示在页面上private void SetBind() SqlConnection cn = new SqlConnection(sqlCon);
17、string sql = select * from tbTopic,tbUser where TopicParentID is null and tbTopic.TopicUserID=tbUser.UserID order by TopicCreateTime desc;SqlDataAdapter da = new SqlDataAdapter(sql,cn);DataTable dt = new DataTable();da.Fill(dt);DataView dv = new DataView(dt);PagedDataSource pds = new PagedDataSource
18、();pds.DataSource = dv;pds.AllowPaging = true;pds.PageSize =5;ViewStateLastPageIndex = pds.PageCount - 1;pds.CurrentPageIndex = int.Parse(ViewStatepageIndex.ToString ();dlMessage.DataSource =pds;dlMessage.DataBind();/主要用于将页面数据分页显示,方便用户浏览页面protected void PageIndex(object sender, EventArgs e)LinkButto
19、n lb = (LinkButton)sender);int pageindex = Int32.Parse(ViewStatepageIndex.ToString();if (lb.Text = 上一页)pageindex = pageindex - 1; if (lb.Text = 下一页) pageindex = pageindex + 1; if (lb.Text = 最后一页)pageindex = Int32.Parse(ViewStateLastPageIndex.ToString(); if (lb.Text = 第一页) pageindex = 0; ViewStatepag
20、eIndex = pageindex;SetBind();/在页面底部显示该页从开始到结束的页码,用户可以随便浏览页面的任何一页private void PageBuilder() int pageCount = Int32.Parse(ViewStateLastPageIndex.ToString() + 1;Hashtable htPageIndex = new Hashtable();for (int i = pageCount - 1; i = 0; i-) htPageIndex.Add(i, pageCount - i); DataList2.DataSource = htPage
21、Index;DataList2.DataBind();protected void lkbPageIndex_Click(object sender, EventArgs e)ViewStatepageIndex = int.Parse(LinkButton)sender).Text) - 1;SetBind();5.2 发表帖子页面图5-2 发表帖子页面功能:用户登录后进行选择感兴趣的主题进行发表帖子,先在标题栏输入你要发表的帖子相关代码如下:public partial class SendMessage : System.Web.UI.PageBLL.tbUser userBLL = n
22、ew BLL.tbUser();BLL.tbTopic topicBLL = new BLL.tbTopic();DAL.tbBoard boardDAL = new DAL.tbBoard();string sqlCon = ConfigurationManager.ConnectionStringsMyCon.ToString();protected void Page_Load(object sender, EventArgs e)if (!IsPostBack)SetBind();/先判断用户是否登录,若登录了,在tb_topic表中取出所有已发表的主题列表,并绑定到repeat控件中
23、private void SetBind() DataTable dtTopic = new DataTable();string strWhere = ;if (SessionUserID != null)strWhere = TopicUserID= + SessionUserID.ToString() + ;dtTopic = topicBLL.GetListTable(strWhere);rptMessage.DataSource = dtTopic;rptMessage.DataBind();/点击发送按钮将用户发表的帖子提交到数据库表tbTopic中protected void b
24、tnSendMessage_Click(object sender, EventArgs e) string TopicID = Guid.NewGuid().ToString();string TopicUserID = SessionUserID.ToString();string TopicBoardID = boardDAL.GetBoardID(ddlBoardName.Text.Trim();using (SqlConnection cn = new SqlConnection(sqlCon) cn.Open();string sqlCmd = insert into tbTopi
25、c (TopicID,TopicTitle,TopicContent,TopicBoardID,TopicUserID,TopicCreateTime) Values(TopicID,TopicTitle,TopicContent,TopicBoardID,TopicUserID,TopicCreateTime);using ( SqlCommand cmd = new SqlCommand(sqlCmd, cn) cmd.Parameters.AddWithValue(TopicID, TopicID);cmd.Parameters.AddWithValue(TopicTitle, txtT
26、itle.Text.Trim();cmd.Parameters.AddWithValue(TopicContent, txtMessage.Text.Trim();cmd.Parameters.AddWithValue(TopicBoardID, TopicBoardID);cmd.Parameters.AddWithValue(TopicUserID, TopicUserID);cmd.Parameters.AddWithValue(TopicCreateTime, DateTime.Now);cmd.ExecuteNonQuery();SetBind();5.3 管理员登录页面图5-3 管
27、理员登录页面功能:管理员登录后台进行管理,相关代码如下:protected void btnLogin_Click(object sender, EventArgs e)string strWhere = UserName= + txtuserID.Text.Trim() + and UserPassword= + txtPassword.Text.Trim() + ;DataTable dtuser = userBLL.GetListTable(strWhere);if (dtuser.Rows.Count 0)/记录用户信息SessionUserID = dtuser.Rows0UserI
28、D.ToString();/记录当前页SessionCurrentPageUrl = HttpContext.Current.Request.Url.PathAndQuery;/跳转到首页Response.Redirect(Default1.aspx);else/用户密码或用户名错误,返回到错误页面Response.Redirect(UserError.aspx);protected void imgLogin_Click(object sender, ImageClickEventArgs e)string strWhere = UserName= + txtuserID.Text.Trim
29、() + and UserPassword= + txtPassword.Text.Trim() + ;DataTable dtuser = userBLL.GetListTable(strWhere );if (dtuser.Rows.Count 0)SessionUserID = dtuser.Rows0UserID.ToString();SessionCurrentPageUrl = HttpContext.Current.Request.Url.PathAndQuery;Response.Redirect(Default1.aspx);elseResponse.Redirect(Use
30、rError.aspx);protected void imgZhuce_Click(object sender, ImageClickEventArgs e)/点击注册按钮,返回到注册页面Response.Redirect(Register1.aspx);5.4 后台用户管理页面图5-4 后台用户管理页面功能:管理员登录用户管理页面对用户进行增加、删除、修改操作,相关代码如下: protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) /若要添加新用户,在gridview底部显示可编辑的行 i
31、f (e.CommandName = New) GridView1.ShowFooter = true; /取消添加用户 if (e.CommandName = AddCancel) GridView1.ShowFooter = false; /点击添加成员按钮后,把已输入的信息提到数据库,并重新显示在gridview控件中 if (e.CommandName = Add) string UserID = Guid.NewGuid().ToString(); string UserName = (GridView1.FooterRow.FindControl(NewUser) as TextB
32、ox).Text; string UserPwd = (TextBox)(GridView1.FooterRow.FindControl(NewPWD).Text; string UserGender = (GridView1.FooterRow.FindControl(NewGender) as RadioButtonList).SelectedValue = 男 ? 1 : 0; string UserEmail = (GridView1.FooterRow.FindControl(NewEmail) as TextBox).Text;/在所编辑的行找到使用的控件,根据用户的UserID,
33、更新用户信息 if (e.CommandName = Update) string userName = (TextBox)(GridView1.RowsGridView1.EditIndex.FindControl(txtUserName).Text; string userPwd = (TextBox)(GridView1.RowsGridView1.EditIndex.FindControl(txtPwd).Text; string userEmail = (TextBox)(GridView1.RowsGridView1.EditIndex.FindControl(txtEmail).
34、Text; int userGender = (GridView1.RowsGridView1.EditIndex.FindControl(rblSex) as RadioButtonList).SelectedValue = 男 ? 1 : 0; string userIsMarried = (GridView1.RowsGridView1.EditIndex.FindControl(rblIsMerried) as RadioButtonList).SelectedValue = 是 ? True : False; string userRight = (TextBox)(GridView
35、1.RowsGridView1.EditIndex.FindControl(txtUserRight).Text; string userID = GridView1.DataKeysGridView1.EditIndex.Value.ToString(); bool HasFileUploaded = false; FileUpload oUpload = GridView1.RowsGridView1.EditIndex.FindControl(uPhoto) as FileUpload; string filename = ; if (oUpload.HasFile) /判断图片是否存在
36、,无则上传,并保存在指定路径 filename = Guid.NewGuid().ToString(D) + System.IO.Path.GetExtension(oUpload.FileName); oUpload.SaveAs(Server.MapPath() + /images/faces/ + filename); HasFileUploaded = true; SqlDataSource1.UpdateCommand = update tbUser set UserName= + userName + ,UserPassword= + userPwd + ,UserEmail= +
37、 userEmail + ,UserGender= + userGender + ,UserFace= + filename + ,UserIsMarried= + userIsMarried + ,UserRight= + userRight + where UserID= + userID + ; else /执行更新语句,完成用户信息更新操作 SqlDataSource1.UpdateCommand = update tbUser set UserName= + userName + ,UserPassword= + userPwd + ,UserEmail= + userEmail +
38、 ,UserFace= + filename + ,UserIsMarried= + userIsMarried + ,UserRight= + userRight + where UserID= + userID + ; /根据用户的UserID,删除用户信息 if (e.CommandName = Delete) string userID = e.CommandArgument.ToString(); string strCon = Data Source=.;Initial Catalog=Forum;Integrated Security=SSPI; string sql = del
39、ete from tbUser where UserID= + userID + ; SqlDataSource1.DeleteCommand = sql; 六、系统总结6.1系统特点及不足本系统能完成留言的发送与回复。其中用户还可以注册,登录等功能。界面设计简单但不缺乏韵味。管理员能对系统进行管理,系统使用了母版页,还是用了一定的权限管理。所以会一个页面的设计就会其他的设计了。有的界面可以合并,比如说留言和查看留言就可以放到一个页面了,这样既方便又美观。修改密码界面还可以增加修改用户名,即可以对用户整体信息进行修改。如果能实现这个功能,系统将会更完善!6.2系统以后的扩展与拓宽有些方面没有考
40、虑到,还有一些功能没有实现。比如说没有考虑版主的问题。不仅管理员可以登录后台对版块进行管理,其实版主也可以直接对版块进行相关的操作。另外界面的友好性可能还不够,也许有些地方只是按照自己的理解设计的,可能存在缺陷,以后慢慢拓宽和改善,也由于自己努力不够,能力有限,希望在以后的学习中让系统尽可能的从各方面完善。6.3自己的体会与感想通过努力,BBS论坛系统基本完成。系统实现了用户注册、登录,帖子浏览,管理员对用户信息、版块信息及帖子信息管理等基本功能。通过本系统的开发,本人感受颇深,受益匪浅,获得了许多宝贵的软件开发经验,对将来的学习和工作都有极大的帮助。但同时,由于个人经验及能力尚欠不足,系统在
41、技术实现上还有很多不尽如人意的地方。比如,一开始就编码,没有很好的做好概要设计,加重了代码修改及维护的工作量;公共类设计的不够精炼,常用方法没有完全集成到公共类中,导致经常重复性编码;只考虑技术的实现,对美工考虑不足,页面间的逻辑关系有时不是很合理等,这些问题都还有待进一步优化、完善。总之觉得开发一款完美的软件真是件不容易的事情,以后我会更加努力。致 谢本系统能够顺利完成要大力感谢指导老师:宋一成老师在百忙中抽出时间给予指导和帮助。同样感谢寝室成员的大力支持!最后,向这些给予我帮助的老师同学致以衷心的谢意。本次课程设计中,我从指导老师宋一成老师身上学到了很多很多的东西。该老师认真负责的工作态度
42、、严谨的治学精神和深厚的理论水平都使我收益匪浅。他无论在理论上还是在实践中,都给予了我很大的帮助,使我得到了不少的提高,这对于我以后的工作和学习都有一种巨大的帮助,感谢他耐心的辅导。在系统开发过程中宋一成老师给予我很大的帮助,帮助解决了不少的难点,使得系统能及时开发完成。谢谢!参考文献 1 周奇.SQL Server2005数据库基础及应用技术.北京大学出版社,2009年2月 2 陈元春 张亮 王勇.实用数据结构基础.2010年8月第2版.中国铁道出版社,2008年8月 3 韩陵宜.网页制作.中国科学技术大学出版社,2011年01 4 Thomas M.Connolly Carolyn E.Begg .数据库设计教程.何玉洁 黄婷儿.第二版.机械工业出版社,2010年12月玻辽锹隔憎汾诈褪盯肤辆搔者沂咒未返杆驴吏醇县喜磺惦搜细溢磕明藐圆迭龄液嘴染席摩虹刻话备励就敞严揽举另沃朋蓄晕裸箍存牛苗吊葡酒