基于VC++的WEB浏览器的实现

news/2024/5/3 21:27:53/文章来源:https://blog.csdn.net/sheziqiong/article/details/126814327

目 录
摘 要 2
1设计题目与要求 2
2系统设计 2
2.1总体设计 2
2.2详细设计 2
2.2.1用户界面设计 3
2.2.2多标签模块设计 6
2.2.3浏览模块设计 6
2.2.4操作按钮模块设计 9
2.2.5页面缩放模块设计 10
2.2.6状态栏模块设计 11
2.2.7收藏夹模块设计 13
2.2.8窗体关闭模块设计 13
2.3系统平台、语言和工具 14
3调试过程及操作说明 14
3.1启动 Web 浏览器 14
3.2浏览网页 14
3.3修改界面样式及查看帮助 16
3.4退出程序 16
4开发中遇到的问题及解决方案 18
4.1无法获取到正确的网页标题 18
4.2多文档模式开发中获取活动窗口的问题 18
4.3页面缩放的问题 19
5目前未解决的问题 19
5.1浏览器状态无法正常显示 19
5.2标签切换时地址栏内容未切换 19
5.3标签切换时网页标题丢失 20
6自我评价与总结 20
参考文献 21
本科毕业论文评分表 22
1设计题目与要求

设计题目:基于VC++的WEB浏览器的实现设计要求:①能实现浏览器外观界面的设计
②能实现网页的浏览、后退、前进、刷新等基本功能
③实现其它附加功能(不在要求范围之内)
④界面良好,功能完善

2系统设计

2.1总体设计

本次毕业设计所实现的 Web 浏览器首先要实现设计要求中的功能,要有友好的界面,能正常的浏览网页,能实现后退、前进、刷新等基本功能。
此外,在要求的功能之上,对 Web 浏览器的功能进行了扩充,能实现网页保存、打印网页、在网页上查找、选中全部内容、标签式多窗口浏览、关闭浏览器提示、页面缩放、网页加载进度显示、浏览器状态以及界面样式更换等功能。

2.2详细设计

本 Web 浏览器具有较多的功能,因而采用了模块化的设计思想,将每个功能做成了相应的模块,便于开发。另外由于 Web 浏览器的自身性质,本次开发采用了 MFC 的多文档(MDI) 模式,使用 App—MainFrame—ChildFrame—View 的模式开发。

// MainFrm.cpp : CMainFrame 类的实现
//#include "stdafx.h"
#include "WebBrowser.h"
#include "ChildFrm.h"
#include "MainFrm.h"
#include "CloseDlg.h"#define WM_NEWURL WM_USER+104
#define ID_STATUSBAR_PROGRESS 9999#ifdef _DEBUG
#define new DEBUG_NEW
#endif// CMainFrameIMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWndEx)BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWndEx)ON_WM_CREATE()// 全局帮助命令ON_COMMAND(ID_HELP_FINDER, &CMDIFrameWndEx::OnHelpFinder)ON_COMMAND(ID_HELP, &CMDIFrameWndEx::OnHelp)ON_COMMAND(ID_CONTEXT_HELP, &CMDIFrameWndEx::OnContextHelp)ON_COMMAND(ID_DEFAULT_HELP, &CMDIFrameWndEx::OnHelpFinder)ON_COMMAND(ID_WINDOW_MANAGER, &CMainFrame::OnWindowManager)ON_COMMAND_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnApplicationLook)ON_UPDATE_COMMAND_UI_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnUpdateApplicationLook)ON_UPDATE_COMMAND_UI(ID_EDIT_BACK,&CMainFrame::ButtonEnable)ON_UPDATE_COMMAND_UI(ID_EDIT_FORWARD,&CMainFrame::ButtonEnable)ON_UPDATE_COMMAND_UI(ID_STATUSBAR_PANE1,&CMainFrame::ButtonEnable)ON_COMMAND(ID_VIEW_CAPTION_BAR, &CMainFrame::OnViewCaptionBar)ON_UPDATE_COMMAND_UI(ID_VIEW_CAPTION_BAR, &CMainFrame::OnUpdateViewCaptionBar)ON_COMMAND(ID_TOOLS_OPTIONS, &CMainFrame::OnOptions)ON_COMMAND(ID_ADDR, &CMainFrame::OnAddr)ON_MESSAGE(WM_NEWURL, &CMainFrame::OnNewUrl)ON_COMMAND(ID_BUTTON18, &CMainFrame::OnZoom)ON_WM_CLOSE()ON_COMMAND(ID_BUTTON_SYSTEM, &CMainFrame::OnButtonSystem)
END_MESSAGE_MAP()// CMainFrame 构造/析构CMainFrame::CMainFrame()
{// TODO: 在此添加成员初始化代码theApp.m_nAppLook = theApp.GetInt(_T("ApplicationLook"), ID_VIEW_APPLOOK_OFF_2007_BLUE);isBack=isForward=FALSE;
}CMainFrame::~CMainFrame()
{
}int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{if (CMDIFrameWndEx::OnCreate(lpCreateStruct) == -1)return -1;BOOL bNameValid;// 基于持久值设置视觉管理器和样式OnApplicationLook(theApp.m_nAppLook);CMDITabInfo mdiTabParams;mdiTabParams.m_style = CMFCTabCtrl::STYLE_3D_ONENOTE; // 其他可用样式...mdiTabParams.m_bActiveTabCloseButton = TRUE;      // 设置为 FALSE 会将关闭按钮放置在选项卡区域的右侧mdiTabParams.m_bTabIcons = TRUE;    // 设置为 TRUE 将在 MDI 选项卡上启用文档图标mdiTabParams.m_bAutoColor = TRUE;    // 设置为 FALSE 将禁用 MDI 选项卡的自动着色mdiTabParams.m_bDocumentMenu = TRUE; // 在选项卡区域的右边缘启用文档菜单mdiTabParams.m_bEnableTabSwap = TRUE;EnableMDITabbedGroups(TRUE, mdiTabParams);m_wndRibbonBar.Create(this);m_wndRibbonBar.LoadFromResource(IDR_RIBBON);if (!m_wndStatusBar.Create(this)){TRACE0("未能创建状态栏\n");return -1;      // 未能创建}CString strTitlePane1;CString strTitlePane2;bNameValid = strTitlePane1.LoadString(IDS_STATUS_PANE1);ASSERT(bNameValid);bNameValid = strTitlePane2.LoadString(IDS_STATUS_PANE2);ASSERT(bNameValid);StatusBar=new CMFCRibbonLabel(strTitlePane1,FALSE);ProgressBar=new CMFCRibbonProgressBar(ID_STATUSBAR_PROGRESS,160);m_wndStatusBar.AddDynamicElement(StatusBar);m_wndStatusBar.AddExtendedElement(ProgressBar,L"进度");m_wndStatusBar.AddSeparator();m_wndStatusBar.AddExtendedElement(new CMFCRibbonStatusBarPane(ID_STATUSBAR_PANE2, strTitlePane2, TRUE), strTitlePane2);// 启用 Visual Studio 2005 样式停靠窗口行为CDockingManager::SetDockingMode(DT_SMART);// 启用 Visual Studio 2005 样式停靠窗口自动隐藏行为EnableAutoHidePanes(CBRS_ALIGN_ANY);// 创建标题栏:if (!CreateCaptionBar()){TRACE0("未能创建标题栏\n");return -1;      // 未能创建}// 启用增强的窗口管理对话框EnableWindowsDialog(ID_WINDOW_MANAGER, ID_WINDOW_MANAGER, TRUE);// 将文档名和应用程序名称在窗口标题栏上的顺序进行交换。这// 将改进任务栏的可用性,因为显示的文档名带有缩略图。ModifyStyle(0, FWS_PREFIXTITLE);return 0;
}BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{if( !CMDIFrameWndEx::PreCreateWindow(cs) )return FALSE;// TODO: 在此处通过修改//  CREATESTRUCT cs 来修改窗口类或样式return TRUE;
}BOOL CMainFrame::CreateCaptionBar()
{if (!m_wndCaptionBar.Create(WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS, this, ID_VIEW_CAPTION_BAR, -1, TRUE)){TRACE0("未能创建标题栏\n");return FALSE;}BOOL bNameValid;CString strTemp, strTemp2;bNameValid = strTemp.LoadString(IDS_CAPTION_BUTTON);ASSERT(bNameValid);m_wndCaptionBar.SetButton(strTemp, ID_TOOLS_OPTIONS, CMFCCaptionBar::ALIGN_LEFT, FALSE);bNameValid = strTemp.LoadString(IDS_CAPTION_BUTTON_TIP);ASSERT(bNameValid);m_wndCaptionBar.SetButtonToolTip(strTemp);bNameValid = strTemp.LoadString(IDS_CAPTION_TEXT);ASSERT(bNameValid);m_wndCaptionBar.SetText(strTemp, CMFCCaptionBar::ALIGN_LEFT);m_wndCaptionBar.SetBitmap(IDB_INFO, RGB(255, 255, 255), FALSE, CMFCCaptionBar::ALIGN_LEFT);bNameValid = strTemp.LoadString(IDS_CAPTION_IMAGE_TIP);ASSERT(bNameValid);bNameValid = strTemp2.LoadString(IDS_CAPTION_IMAGE_TEXT);ASSERT(bNameValid);m_wndCaptionBar.SetImageToolTip(strTemp, strTemp2);return TRUE;
}// CMainFrame 诊断#ifdef _DEBUG
void CMainFrame::AssertValid() const
{CMDIFrameWndEx::AssertValid();
}void CMainFrame::Dump(CDumpContext& dc) const
{CMDIFrameWndEx::Dump(dc);
}
#endif //_DEBUG// CMainFrame 消息处理程序void CMainFrame::OnWindowManager()
{ShowWindowsDialog();
}void CMainFrame::OnApplicationLook(UINT id)
{CWaitCursor wait;theApp.m_nAppLook = id;switch (theApp.m_nAppLook){case ID_VIEW_APPLOOK_WIN_2000:CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManager));m_wndRibbonBar.SetWindows7Look(FALSE);break;case ID_VIEW_APPLOOK_OFF_XP:CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOfficeXP));m_wndRibbonBar.SetWindows7Look(FALSE);break;case ID_VIEW_APPLOOK_WIN_XP:CMFCVisualManagerWindows::m_b3DTabsXPTheme = TRUE;CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));m_wndRibbonBar.SetWindows7Look(FALSE);break;case ID_VIEW_APPLOOK_OFF_2003:CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2003));CDockingManager::SetDockingMode(DT_SMART);m_wndRibbonBar.SetWindows7Look(FALSE);break;case ID_VIEW_APPLOOK_VS_2005:CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerVS2005));CDockingManager::SetDockingMode(DT_SMART);m_wndRibbonBar.SetWindows7Look(FALSE);break;case ID_VIEW_APPLOOK_VS_2008:CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerVS2008));CDockingManager::SetDockingMode(DT_SMART);m_wndRibbonBar.SetWindows7Look(FALSE);break;case ID_VIEW_APPLOOK_WINDOWS_7:CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows7));CDockingManager::SetDockingMode(DT_SMART);m_wndRibbonBar.SetWindows7Look(TRUE);break;default:switch (theApp.m_nAppLook){case ID_VIEW_APPLOOK_OFF_2007_BLUE:CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_LunaBlue);break;case ID_VIEW_APPLOOK_OFF_2007_BLACK:CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_ObsidianBlack);break;case ID_VIEW_APPLOOK_OFF_2007_SILVER:CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Silver);break;case ID_VIEW_APPLOOK_OFF_2007_AQUA:CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Aqua);break;}CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2007));CDockingManager::SetDockingMode(DT_SMART);m_wndRibbonBar.SetWindows7Look(FALSE);}RedrawWindow(NULL, NULL, RDW_ALLCHILDREN | RDW_INVALIDATE | RDW_UPDATENOW | RDW_FRAME | RDW_ERASE);theApp.WriteInt(_T("ApplicationLook"), theApp.m_nAppLook);
}void CMainFrame::OnUpdateApplicationLook(CCmdUI* pCmdUI)
{pCmdUI->SetRadio(theApp.m_nAppLook == pCmdUI->m_nID);
}void CMainFrame::OnViewCaptionBar()
{m_wndCaptionBar.ShowWindow(m_wndCaptionBar.IsVisible() ? SW_HIDE : SW_SHOW);RecalcLayout(FALSE);
}void CMainFrame::OnUpdateViewCaptionBar(CCmdUI* pCmdUI)
{pCmdUI->SetCheck(m_wndCaptionBar.IsVisible());
}void CMainFrame::OnOptions()
{CMFCRibbonCustomizeDialog *pOptionsDlg = new CMFCRibbonCustomizeDialog(this, &m_wndRibbonBar);ASSERT(pOptionsDlg != NULL);pOptionsDlg->DoModal();delete pOptionsDlg;
}void CMainFrame::OnAddr()
{CMFCRibbonEdit *pEdit=DYNAMIC_DOWNCAST(CMFCRibbonEdit, m_wndRibbonBar.FindByID(ID_ADDR));  //获取地址输入框CString strUrl=pEdit->GetEditText();  //获取地址框文本if(strUrl=="")  //数据合法性判断MessageBox(L"请输入要访问的网址!",L"提示",MB_ICONWARNING);else{CChildFrame *pChildFrame=(CChildFrame*)GetActiveFrame();CHtmlView *pBrowser=(CHtmlView*)pChildFrame->GetActiveView();if(pBrowser->GetLocationURL()!=strUrl) pBrowser->Navigate(strUrl);}
}void CMainFrame::ChangeAddr(CString str)
{  //修改地址输入框文本CMFCRibbonEdit *pEdit=DYNAMIC_DOWNCAST(CMFCRibbonEdit, m_wndRibbonBar.FindByID(ID_ADDR));pEdit->SetEditText(str);
}double CMainFrame::GetZoom()
{   //获取滑块的值CMFCRibbonSlider *pSlider=DYNAMIC_DOWNCAST(CMFCRibbonSlider, m_wndRibbonBar.FindByID(ID_SLIDER2));return (pSlider->GetPos())/10.0;
}void CMainFrame::SetStatusText(LPCTSTR str)
{  //设置状态栏文本(有Bug)CString tmp=str;static BOOL isFinish=TRUE;if(StatusBar&&!tmp.IsEmpty()&&isFinish) StatusBar->SetText(str);isFinish=tmp.Find(L"完成",0);
}void CMainFrame::SetProgress(long value,long max)
{  //设置进度条if(ProgressBar){ProgressBar->SetRange(0,max);ProgressBar->SetPos(value);}
}afx_msg LRESULT CMainFrame::OnNewUrl(WPARAM wParam, LPARAM lParam)
{  //CHtmlView类打开了新窗口LPDISPATCH* ppDispatch=(LPDISPATCH*)wParam;SendMessage(WM_COMMAND, ID_FILE_NEW, 0);CChildFrame* pChildFrame = (CChildFrame*)GetActiveFrame();*ppDispatch=((CHtmlView*)pChildFrame->GetActiveView())->GetApplication();return 0;
}void CMainFrame::OnZoom()
{
}void CMainFrame::OnClose()
{  //处理WM_CLOSECCloseDlg closeDlg;UINT r=closeDlg.DoModal();  //打开关闭对话框if(r==IDALL) CMDIFrameWndEx::OnClose();else if(r==IDCUR) GetActiveFrame()->DestroyWindow();
}void CMainFrame::SetButtonState(BOOL sForward,BOOL sBack)
{  //接收后退、前进按钮状态isBack=sBack;isForward=sForward;
}void CMainFrame::ButtonEnable(CCmdUI *pCmdUI)
{  //设置按钮可用if(pCmdUI->m_nID==ID_EDIT_FORWARD) pCmdUI->Enable(isForward);else if(pCmdUI->m_nID==ID_EDIT_BACK) pCmdUI->Enable(isBack);else pCmdUI->Enable(TRUE);
}void CMainFrame::OnButtonSystem()
{  //打开系统信息ShellAbout(this->m_hWnd,L"Crazy Urus 浏览器",L"Crazy Urus 浏览器\n\r作者:廖星(Crazy Urus)",AfxGetApp()->LoadIcon(IDR_MAINFRAME));
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_6826.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网页设计中蒸汽朋克的美丽例子

即使你不熟悉蒸汽朋克这个词,你无疑已经通过流行文化被介绍到了这种设计现象。蒸汽朋克指的是一种异想天开的风格,这种风格基于对19世纪可能的反乌托邦世界的想象。这听起来可能有点复杂,但这个折衷的类别将H.G.威尔斯的想法与维多利亚时代的设计、工业主义主题、后世界末日…

第3章 基础项目的搭建

3.1 后端项目搭建 3.1.1 gitee下载脚手架 下载地址:https://gitee.com/77jubao2015/springbootdemo 打开浏览器输入以上地址,点击下载即可,如图所示: 3.1.2 把脚手架导入到idea开发工具 步骤01 把下载后的脚手架放到指定位置并解…

数据库基本概念

目录 一、数据库概念 1、数据库的组成 (数据为行,字段为列) 2、数据库的管理系统(DBMS) 二、数据库系统发展史 1、第一代数据库(人工管理) 2、第二代数据库(文件管理) 3、第三…

大学SQLServer2012 安装流程+启动+登录+用户的操作

这里写目录标题第一步下载解压的文件第二步骤安装软件第三步执行安装选项执行安装选项1执行安装选项2执行安装选项3 同意条款执行安装选项4配置检测执行安装选项5 下载需求组件执行安装选项6 上面安装完成后执行安装选项需求---关闭防火墙执行安装选项7--重新检测执行安装选项8…

SpringMVC基础:AJAX发送请求

AJAX请求 前面我们讲解了如何向浏览器发送一个JSON格式的数据,那么我们现在来看看如何向服务器请求数据。 Ajax即Asynchronous Javascript And XML(异步JavaScript和XML),它的目标就是实现页面中的数据动态更新,而不是…

微服务--数据一致性

本篇文章讲解微服务数据一致性相关的知识 一、案例 在使用微服务时,存在跨多个服务更新数据库数据的情况。那么这就会出现一个问题,比如我们有三个服务(如下图),正常情况下,当一个请求进来时,…

【软件与系统安全笔记】五、内存破坏防御

【软件与系统安全】五、内存破坏防御 这是《【软件与系统安全】笔记与期末复习》系列中的一篇 虽然对缓冲区溢出的认知已超过 40 年之久, 但缓冲区溢出仍未被消除。部分原因在于存在大量的利用选项: 多样的目标: 不仅仅可以利用返回地址, 实际上可以利用任意代码地…

JDK1.8中的Stream流源码中的常用方法全面解析附代码演示及源码展示

文章目录💨更多相关知识👇🍂allMatch🌟代码演示🍂anyMatch🌟代码演示🍂noneMatch🌟代码演示🍂findFirst🌟代码演示🍂findAny🌟代码演示…

【愚公系列】2022年09月 微信小程序-WebGL纹理材质的使用

文章目录前言一、webgl的使用1.立体图形的绘制二、相关包源码三、总结前言 WebGL(全写Web Graphics Library)是一种3D绘图协议,这种绘图技术标准允许把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的一个JavaScrip…

[含毕业设计论文+PPT+源码等]ssm培训机构管理系统+Java后台管理系统|前后分离VUE

💖💖更多项目资源,最下方联系我们✨✨✨✨✨✨ 目录 微信小程序项目介绍 资料获取 微信小程序项目介绍 计算机毕业设计java毕设项目之微信小程序ssm培训机构管理系统小程序后台管理系统_哔哩哔哩_bilibili计算机毕业设计java毕设项目之微信…

基于Springboot健身会员俱乐部管理系统设计

开发技术: Idea Springboot Mysql 功能描述: 1 系统管理员模块的具体需求如下: (1)会员管理:系统管理员在本系统中拥有对会员进行管理的功能。包括会员的注册、个人信息的修改、会员的删除、变更和查询&#xff0c…

Linux——权限

目录 Linux权限的概念 Linux权限管理 文件访问者的分类 文件类型和访问权限 文件类型 基本权限 文件权限值的表示方法 文件访问权限的相关设置方法 目录的权限 粘滞位 关于权限的总结 Linux权限的概念 Linux下有两种用户:超级用户(root)、…

k8s 集群 使用yaml部署Tomcat方法

使用ymal部署Tomcat6 命令中,通过–dry-run选项,并不会真正的执⾏这条命令。 –dry-run‘none’: Must be “none”, “server”, or “client”. If client strategy, only print the object thatwould be sent, without sending it. If server strate…

计算机毕业设计之java+springboot基于vue的农机电招平台

计算机毕业设计之javaspringboot基于vue的农机电招平台 项目介绍 随着农机电招行业的不断发展,农机电招在现实生活中的使用和普及,农机电招行业成为近年内出现的一个新行业,并且能够成为大群众广为认可和接受的行为和选择。设计农机电招平台的目的就是借助计算机让复杂的销售操…

车企竞相“入股”元宇宙,美格智能着力打造制胜秘诀

2021年,元宇宙一夜爆红,引发社会各界关注。在“元宇宙”概念爆发初期,这个新概念下的产业与生态还是一片草莽。直到2021年底,在全社会的“元宇宙热”之下,各大企业才正式开启对元宇宙的竞相追逐,展开了元宇…

基于SSH的高校竞赛报名系统设计与实现

目录 1 需求分析 1 2 概要设计 1 (1)数据结构 1 (2) 模块划分 2 (3) 总体框架 2 (4)数据库设计: 2 ER图 2 数据库表结构: 3 3 详细设计 4 4 调试分析 6 5 测试…

TreeMap和LinkedHashMap

TreeMap 总体特点:(主要是跟linkedHashMap比较) 底层是基于红黑树实现,是个有序集合,按照key的compareTo方法或在构造时传入的Comparator比较器进行排序。这里需要注意如果在构造 时没有传入Comparator,那…

猿创征文|瑞吉外卖——移动端_地址管理

个人名片: 博主:酒徒ᝰ. 专栏:瑞吉外卖 个人简介:沉醉在酒中,借着一股酒劲,去拼搏一个未来。 本篇励志:人会想很多事,而且多半是痛苦的,时光如水,我们无法阻止…

02-Vue li环境搭建

一、Vue cli 介绍 什么是vue-cli vue-cli是由vue官方发布的快速构建vue单页面的脚手架 为什么要用vue-cli构建项目 用vue-cli可以实现webpack的快速打包 ,打包。 代码重用 兼容ES6 ;jQuery语言:ES5 兼容nodeJS 只有 一个单界面。index.html.在vue组…

maven常用插件详解

1. 简介 我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven- compiler-plugin完成的。进一步说,每个任务对应了一个插件目标(goal&…