听阳光的猫

道阻且长、望你如一

0%

电商后台管理系统

项目初始化

前端项目初始化

首先安装node

  1. 安装vue脚手架

    控制面板执行 npm install -g @vue/cli

    查看版本是否正确 vue --version

  2. 通过vue脚手架创建项目

    vue create vue-shop 也可以创建

    vue ui进入vue管理页面

    手动创建项目选择功能

    • Babel
    • Router
    • 使用配置文件
  3. 配置vue路由

  4. 插件Element-UI组件库

    此组件暂时不支持vue3.0

    添加插件 vue-cli-plugin-element

    配置 Import on demand

  5. 依赖axios库

    安装依赖 axios

  6. 初始化git远程仓库

  7. 将本地项目托管到github

后台项目初始化

  1. 安装MySQL

    1602942192075

    1602942422366

    1602942354100

  2. 安装Node.js环境

    1602942493161

  3. 配置相关信息

  4. 启动项目

  5. 使用postman测试后台接口是否正常

    1602944933697

使用Git开发项目

git status 先查看当前目录下是否干净

git checkout -b login 创建分支

git branch 查看分支

创建vue_shop之后可以将无用的文件删除

  1. HelloWorld.vue

  2. About.vue

  3. Home

  4. App.vue中的框架

    image-20201016205142333

    image-20201016205057108

登录/退出功能

创建登陆组件

image-20201016210414934

image-20201016210436922

image-20201016210342257

安装 开发依赖lessless-loader 这样才能够使用

或者使用命令行npm install -g less

全局样式表

image-20201016215852488

入口js导入

image-20201016215944320

绘制头像

image-20201016220104486

image-20201016220140754

表单区域

image-20201016222950885

带icon的input输入框

1602946003097

1602946216501

实现表单的数据绑定

image-20201017160958316

image-20201017161026444

表单数据验证

image-20201017162503259

image-20201017162624623

表单的重置功能

image-20201017164337886

image-20201017164408600

image-20201017164436901

表单预验证

image-20201017165432379

image-20201017165504825

配置axios发出登录请求

1602990769593

1602991269071

1602991831386

配置message全局弹窗组件

1602992044075

1602992276683

登录之后的操作

1602993253177

1602993331962

1602993377617

路由导航守卫控制页面访问权限

只有在登录状态下才能够访问home对应页面

1602995592589

若出现了**Uncaught TypeError: Cannot read property 'beforeEach' of undefined**

则参照上面方式修改

实现退出功能

1602997552236

修改element组件按需导入形式

1603003349546

将本地代码提交

  1. git status 查看修改状态
  2. git add . 添加
  3. git status 查看提交状态
  4. git commit -m "完成了登录功能" 提交的本地仓库
  5. git branch 查看分支
  6. git checkout master 切换分支
  7. git branch 查看分支
  8. git merge login 合并分支
  9. git push 上传master到云端
  10. git checkout login 切回login分支
  11. git branch 查看分支
  12. git push -u origin login 上传login到云端

主页布局

实现基本主页布局

1603006204646

1603006780002

1603006819100

设置主页header区域

1603007470078

1603007504287

导航菜单基本结构

1603008861333

1603009153974

通过axios拦截器添加token验证

1603009921871

获取左侧菜单

1603011145158

通过双层for循环渲染左侧菜单

1603012068850

为选中的项设置字体颜色并添加分类图标

image-20201019111121958

1603012874423

1603012921735

1603012951242

1603015784245

每次只能打开一个菜单项及边框问题

image-20201019111151560

1603013377395

1603015637205

侧边栏的折叠与展开效果

image-20201019111050760

1603015427522

1603015475719

1603015523484

1603015573389

实现首页路由的重定向

1603016380869

1603016465823

1603016502972

实现侧边栏路由由链接的改造

1603017131647

1603017363275

用户列表

用户列表

通过路由的形式展示用户列表组件

image-20201019110653380

image-20201019110827352

在sessionStorage中保存左侧菜单的激活状态

image-20201019111316374

image-20201019114343527

image-20201019114951094

image-20201019115256860

image-20201019115421075

image-20201019115720137

绘制用户列表组件的基础布局结构

image-20201019120942631

image-20201019123211721

image-20201019123302722

image-20201019123528909

image-20201019123610193

获取用户列表数据

image-20201019125017168

使用el-table组件渲染基本的用户列表

image-20201019125629478

image-20201019125633148

image-20201019125637400

image-20201019130651526

image-20201019130806519

image-20201019130855044

为表格添加索引列

image-20201019153153039

自定义状态列的显示效果

image-20201019154709564

image-20201019154927072

作用域插槽渲染操作列

image-20201019155536107

image-20201019161002393

实现分页效果

image-20201019162929917

image-20201019163022816

image-20201019163106979

image-20201019163203752

image-20201019163229430

修改用户状态

image-20201019165701176

image-20201019165828035

实现搜索功能

image-20201019171113396

添加用户

渲染添加用户对话框

image-20201019190545648

image-20201019191427279

image-20201019191543381

image-20201019191617183

渲染添加用户的表单

image-20201019193401296

image-20201019204135650

自定义邮箱和手机号的校验规则

image-20201019211331083

image-20201019211501807

添加变得的重置操作

image-20201019212420252

image-20201019212535789

添加用户前的表单预验证

image-20201019213005837

image-20201019213615676

调用API接口完成添加用户的操作

image-20201019214748565

修改用户

展示修改用户对话框

image-20201019221258805

image-20201019221626649

image-20201019221813089

image-20201019222113347

根据id查询对应的用户信息

image-20201019222822508

image-20201019223011257

image-20201019223941713

渲染修改用户的表单

image-20201019225137461

image-20201019225603445

实现修改用户表单的重置操作

image-20201019230012680

image-20201019230323948

完成提交修改之前的表单预验证

image-20201019230738694

image-20201019231136762

提交表单完成用户信息的修改

image-20201019232224594

删除用户

弹窗询问用户是否确认删除数据

image-20201020083134523

image-20201020083513602

image-20201020085948290

调用API完成删除用户的操作

image-20201020090720548

权限管理

权限列表

创建rights子分支

  1. git branch 查看当前分支
  2. git checkout -b rights 创建rights分支
  3. git branch 查看当前分支
  4. git push -u origin rights

通过路由展示权限列表组件

image-20201020093949758

image-20201020094036442

绘制面包屑导航和卡片视图

image-20201020094533681

调用API获取权限列表数据

image-20201020095606994

渲染权限列表UI结构

image-20201020100100883

image-20201020100833367

角色列表

通过路由展示角色列表组件

image-20201020102530069

image-20201020102646119

绘制基本布局结构并获取列表数据

image-20201020103646178

image-20201020233046477

渲染角色列表数据

image-20201020105619631

通过第一层for循环渲染一级权限

image-20201020223200425

美化一级权限的UI结构

image-20201020223729637

image-20201021092953084

通过二层for循环渲染二级权限

image-20201021100112426

通过第三层for循环渲染三级权限

image-20201021100004332

美化角色下权限的UI结构

image-20201021100736922

image-20201021100924625

点击删除权限按钮弹出确认框提示

image-20201021113116688

image-20201021114700375

完成删除角色下指定的权限功能

image-20201021120300233

image-20201021120342645

image-20201021120502393

分配权限

弹出分配权限对话框并请求权限数据

image-20201022180005146

image-20201022180448308

image-20201022180643100

image-20201022181102380

初步配置并使用el-tree树形控件

image-20201022181654361

image-20201022181857416

image-20201022182123401

优化树形控件的展示效果

image-20201022182521481

分析已有权限默认勾选的实现思路

image-20201022183302563

image-20201022183328730

加载当前角色已有的权限

image-20201022185237708

image-20201022184900725

image-20201022185141402

在关闭对话框时重置defKeys数组

image-20201022185831749

image-20201022185911205

调用API完成分配权限功能

image-20201022190850070

image-20201022190959240

image-20201022191113662

image-20201022220710473

渲染分配角色的对话框并请求角色列表数据

image-20201022221614330

image-20201022223306647

image-20201022222641495

image-20201022223126401

渲染角色列表的select下拉菜单

image-20201022223902731

image-20201022224133787

image-20201022224237566

完成分配角色的功能

image-20201022224737170

image-20201022225331879

image-20201022230542032

image-20201022230448832

提交本地代码到Git仓库

  1. git branch
  2. git add .
  3. git commit -m "完成了权限功能的开发"
  4. git push
  5. git checkout master
  6. git merge rights
  7. git branch
  8. git push

分类管理

商品分类

创建good_cate子分支

  1. git branch
  2. git checkout -b goods_cate
  3. git push -u origin goods_cate

通过路由加载商品分类组件

image-20201023092113691

image-20201023092221116

绘制商品分类组件的基本页面布局

image-20201023092759804

调用API获取商品分类的列表数据

image-20201023094104530

image-20201023094142024

初步使用vue-table-with-tree-grid树形表格组件

安装vue-table-with-tree-grid树形表格组件

  1. 使用命令行npm i vue-table-with-tree-grid -S

  2. vue ui 在运行依赖中搜索并安装

    image-20201023102156822

image-20201023102657196

image-20201023102731130

使用自定义模板列渲染表格数据

image-20201023103821453

image-20201023103910274

渲染排序和操作对应 的UI结构

image-20201023110209047

image-20201023110254820

实现分页功能

image-20201023111707944

image-20201023111754417

image-20201023111201833

image-20201023111851627

渲染添加分类的对话框和表单

image-20201023133144076

image-20201023134023101

image-20201023134643418

image-20201023134946242

获取父级分类数据列表

image-20201023135515490

image-20201023140523099

渲染级联选择器

image-20201023141455625

image-20201023142114809

image-20201023142632742

image-20201023142929859

image-20201023143206562

根据父分类的变化处理表单中的数据

image-20201023145341274

image-20201023145544630

image-20201023145458137

image-20201023150105181

image-20201023150007991

在对话框的close事件中重置表单数据

image-20201023151640682

image-20201023150942829

分支操作

完成添加分类的操作

image-20201023152450624

将good_cate分支上的代码提交到Git仓库中

  1. git branch
  2. git add .
  3. git commit -m "完成了分类功能的开发"
  4. git push
  5. git checkout master
  6. git merge good_cate
  7. git branch
  8. git push

参数管理

分类参数

创建goods_params分支

  1. git branch
  2. git checkout -b goods_params
  3. git push -u origin goods_params

通过路由加载分类参数组件页面

image-20201023173503072

image-20201023173538295

image-20201023172310992

渲染分类参数页面的基本UI结构

image-20201023174107832

image-20201023174614425

image-20201023174647426

调用API获取商品分类列表数据

image-20201023175414857

渲染商品分类的级联选择框

image-20201023180500422

image-20201023180555601

element的级联选择器Cascader无滚动条样式全部显示超出屏幕解决办法

1
2
3
4
/ 在全局的global.css样式中给el-cascader-panel添加高度
.el-cascader-panel{
height: 200px;
}

image-20201023202513715

控制级联选择框的选中范围

image-20201023203056468

渲染分类参数的Tabs页签

image-20201023203741015

image-20201023204324954

image-20201023204414140

image-20201023204453456

渲染添加参数按钮并控制按钮的禁用状态

image-20201023205429619

image-20201023205547456

获取参数列表数据

image-20201023210208651

image-20201023210914829

image-20201023212104525

image-20201023211050058

切换Tabs面板后重新获取参数列表数据

image-20201023212845582

将获取到的参数数据挂载到不同的数据源上

image-20201023215350198

image-20201023215532059

渲染动态参数和静态属性的Table表格

image-20201023222306045

image-20201023222937462

添加参数

渲染添加参数的对话框

image-20201023224434985

image-20201023224741127

image-20201023225102971

image-20201023225451783

image-20201023225733611

完成动态参数和静态属性的添加操作

image-20201023230238030

image-20201023231156650

修改参数

渲染修改参数的对话框

image-20201024170118728

image-20201024170207849

image-20201024170709890

image-20201024171156038

image-20201024171500902

完成修改参数的操作

image-20201024212636875

image-20201024212737907

image-20201024211543414

image-20201024212329886

删除参数

完成删除参数的业务逻辑

image-20201024215939601

image-20201024220038895

image-20201024221628164

分类参数

渲染参数下的可选项

image-20201025121959802

image-20201025122309828

image-20201025122405513

解决attr_vals为空字符串时候的小问题

image-20201025123013646

控制按钮与文本框的切换显示

image-20201025123801456

image-20201025124116279

image-20201025124358947

image-20201025124446933

为每一行数据提供单独的inputVisible和inputValue

image-20201025130746057

image-20201025131212911

image-20201025131308271

让文本框自动获得焦点

image-20201025132234746

实现文本框与按钮的切换显示

image-20201025132636374

image-20201025132904668

完成参数可选项的添加操作

image-20201025134044325

删除参数下的可选项

image-20201025134543457

image-20201025140027539

清空表格数据

image-20201025140346009

完成静态属性表格中的展开行效果

image-20201025140951345

将本地good_params分支代码提交并推送

  1. git branch
  2. git add .
  3. git commit -m "完成了分类参数的开发"
  4. git push
  5. git checkout master
  6. git merge good_params
  7. git branch
  8. git push

商品管理

商品列表

创建goods_list子分支并推送

  1. git branch
  2. git checkout -b goods_list
  3. git push -u origin goods_list

通过路由加载商品列表组件

image-20201025142746741

image-20201025164445598

image-20201025143714335

获取商品列表数据

image-20201025150821210

image-20201025153523186

渲染商品表格数据

image-20201025153741832

自定义格式化时间的全局过滤器

image-20201025155846076

image-20201025155943341

实现商品列表的分页功能

image-20201025160426204

image-20201025160638676

实现搜索与清空的功能

image-20201025161904284

根据Id删除商品数据

image-20201025162425335

image-20201025162906770

通过编程式导航跳转到商品添加页面

image-20201025163416282

image-20201025163628576

image-20201025163924911

image-20201025164227138

image-20201025164546396

商品添加

渲染添加页面的基本结构

image-20201025171444729

image-20201025171522962

美化步骤条组件

image-20201025172043433

image-20201025172120531

image-20201025172335827

渲染tab栏区域

image-20201025172907888

实现步骤条和tab栏数据的联动效果

image-20201025173557262

image-20201025173250527

分析表单的组成部分

image-20201026131317370

image-20201025174006591

绘制基本信息面板的UI结构

image-20201025180642183

image-20201025180841012

获取商品分类数据

image-20201025181547719

绘制商品分类的级联选择器

image-20201025182559686

image-20201025182852021

image-20201025183003890

image-20201025183226491

只允许选中三级商品分类

image-20201026105638433

阻止页签切换

image-20201026111820333

image-20201026112402919

获取动态参数列表数据

image-20201026113013993

image-20201026113949990

image-20201026123728292

image-20201026113338729

绘制商品参数面板中的复选框组

image-20201026120007876image-20201026120648527

image-20201026123556071

优化复选框的样式

image-20201026124126547

获取静态属性列表数据

image-20201026124801335

image-20201026125520458

渲染商品属性面板的UI结构

image-20201026130204211

初步使用upload上传组件

image-20201026145618098

image-20201026152658884

image-20201026150033620

image-20201026150349503

手动为upload组件绑定headers请求头

image-20201026151206578image-20201026152738786

image-20201026151705156

监听upload组件的on-success事件

image-20201026153217506

image-20201026153710972

image-20201026153603483

监听upload组件的on-remove事件

image-20201026154808727

实现图片的预览效果

image-20201026160500516

image-20201026161036747

image-20201026160721924

image-20201026160741079

安装并配置vue-quill-editor

npm install vue-quill-editor --save

image-20201026162618134

image-20201026162945679

image-20201026163320300

image-20201026163057749

image-20201026163416492

image-20201026163525193

实现表单数据的预验证

image-20201026164346601

把goods_cat从数组转化为字符串

image-20201026172153184

image-20201026172231914

处理attrs数组

image-20201026172841971

image-20201026173508980

完成商品添加操作

image-20201026174155951

将goods_list分支的代码合并并推送

  1. git branch
  2. git add .
  3. git commit -m "完成了商品功能的开发"
  4. git push
  5. git checkout master
  6. git merge goods_list
  7. git branch
  8. git push

订单管理

订单列表

创建order分支

  1. git branch
  2. git checkout -b order
  3. git push -u origin order

通过路由渲染订单列表页面

image-20201026181914688

image-20201026182122921

image-20201026182553712

根据分页获取订单数据列表

image-20201026183415073

渲染订单table表格

image-20201026194648643

实现分页功能

image-20201026190144999

image-20201026190318895

image-20201027103112405

实现省市区县数据联动效果

image-20201026194400459

image-20201026194037293

image-20201026192930554

image-20201026193129569

展示物流进度对话框并获取物流信息

image-20201026194907473

image-20201026195229213

image-20201026195323595

image-20201026195944912

后台服务器存在问题,没有返回数据

手动导入并使用Timeline组件

image-20201027102154985

image-20201027102404903

image-20201027103041175

将本地order分支的代码合并且推送

  1. git branch
  2. git add .
  3. git commit -m "完成了订单功能的开发"
  4. git push
  5. git checkout master
  6. git merge order
  7. git branch
  8. git push

数据统计

数据概述

创建report分支

  1. git branch
  2. git checkout -b report
  3. git push -u origin report

通过路由加载数据报表组件

image-20201027115710237

image-20201027115952086

image-20201027120120171

安装Echarts并渲染Demo图表

npm install echarts --save

image-20201027121528544

image-20201027121630641

获取折线图数据并渲染图表

image-20201027122214736

image-20201027122511334

image-20201027123122992

将本地的report分支合并且推送

  1. git branch
  2. git add .
  3. git commit -m "完成了报表功能的开发"
  4. git push
  5. git checkout master
  6. git merge report
  7. git branch
  8. git push

项目优化

通过nprogress添加进度条效果

npm install --save nprogress

image-20201027130905283

只在发布阶段移除所有的console

npm install babel-plugin-transform-remove-console --save-dev

image-20201030212147198

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 这是项目发布阶段需要用到的babel插件
const prodPlugins=[]
if(process.env.NODE_ENV==='production'){
prodPlugins.push('transform-remove-console')
}

module.exports = {
"presets": [
"@vue/cli-plugin-babel/preset"
],
"plugins": [
[
"component",
{
"libraryName": "element-ui",
"styleLibraryName": "theme-chalk"
}
],
// 发布 产品时候的插件数组
...prodPlugins
]
}

生成打包报告

image-20201027134040757

vue-cli-service build --report

通过vue.config.js修改webpack的默认配置

https://cli.vuejs.org/zh/config/#vue-config-js

image-20201027134113601

介绍configureWebpack与chainWebpack

image-20201027134243762

image-20201027134317993

https://cli.vuejs.org/zh/guide/webpack.html#webpack-%E7%9B%B8%E5%85%B3

通过chainWebpack自定义打包入口

image-20201027134424769

image-20201030220349705

1
2
3
4
5
6
7
8
9
10
11
12
13
const { config } = require("vue/types/umd");

module.exports = {
chainWebpack: config => {
config.when(process.env.NODE_ENV === 'production', config => {
config.entry('app').clear().add('./src/main-prod.js')
})

config.when(process.env.NODE_ENV === 'development', config => {
config.entry('app').clear().add('./src/main-dev.js')
})
}
}

通过externals加载外部CDN资源

image-20201031122606650

1
2
3
4
5
6
7
8
9
config.set('externals', { 
vue: 'Vue',
'vue-router': 'VueRouter',
axios: 'axios',
lodash: '_',
echarts: 'echarts',
nprogress: 'NProgress',
'vue-quill-editor': 'VueQuillEditor'
})

image-20201031122918522

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!-- nprogress 的样式表文件 -->
<link rel="stylesheet" href="https://cdn.staticfile.org/nprogress/0.2.0/nprogress.min.css" />
<!-- 富 文本编辑器的样式表文件 -->
<link rel="stylesheet" href="https://cdn.staticfile.org/quill/1.3.4/quill.core.min.css" />
<link rel="stylesheet" href="https://cdn.staticfile.org/quill/1.3.4/quill.snow.min.css" />
<link rel="stylesheet" href="https://cdn.staticfile.org/quill/1.3.4/quill.bubble.min.css" />

<script src="https://cdn.staticfile.org/vue/2.5.22/vue.min.js"></script>
<script src="https://cdn.staticfile.org/vue-router/3.0.1/vue-router.min.js"></script>
<script src="https://cdn.staticfile.org/axios/0.18.0/axios.min.js"></script>
<script src="https://cdn.staticfile.org/lodash.js/4.17.11/lodash.min.js"></script>
<script src="https://cdn.staticfile.org/echarts/4.1.0/echarts.min.js"></script>
<script src="https://cdn.staticfile.org/nprogress/0.2.0/nprogress.min.js"></script>
<!-- 富 文本编辑器的 js 文件 -->
<script src="https://cdn.staticfile.org/quill/1.3.4/quill.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue-quill-editor@3.0.4/dist/vue-quill-editor.js"></script>

若报错

image-20201031162539875

image-20201031162510160

通过CDN优化ElementUI的打包

image-20201031164124464

image-20201031164232122

自定制首页内容

image-20201031171814779

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
module.exports = {
chainWebpack: config => {
// 发布模式
config.when(process.env.NODE_ENV === 'production', config => {
config.entry('app').clear().add('./src/main-prod.js')

config.set('externals', {
vue: 'Vue',
'vue-router': 'VueRouter',
axios: 'axios',
lodash: '_',
echarts: 'echarts',
nprogress: 'NProgress',
'vue-quill-editor': 'VueQuillEditor'
})

config.plugin('html').tap(args => {
args[0].isProd = true
return args
})
})

// 开发模式
config.when(process.env.NODE_ENV === 'development', config => {
config.entry('app').clear().add('./src/main-dev.js')

config.plugin('html').tap(args => {
args[0].isProd = false
return args
})
})
}
}

image-20201031174051108

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title>
<%= htmlWebpackPlugin.options.isProd ? '' : 'dev - ' %>电商后台管理系统</title>
<% if(htmlWebpackPlugin.options.isProd) { %>
<!-- nprogress 的样式表文件 -->
<link rel="stylesheet" href="https://cdn.staticfile.org/nprogress/0.2.0/nprogress.min.css" />
<!-- 富 文本编辑器的样式表文件 -->
<link rel="stylesheet" href="https://cdn.staticfile.org/quill/1.3.4/quill.core.min.css" />
<link rel="stylesheet" href="https://cdn.staticfile.org/quill/1.3.4/quill.snow.min.css" />
<link rel="stylesheet" href="https://cdn.staticfile.org/quill/1.3.4/quill.bubble.min.css" />
<!-- element-ui 的样式表文件 -->
<link rel="stylesheet" href="https://cdn.staticfile.org/element-ui/2.8.2/theme-chalk/index.css" />

<script src="https://cdn.staticfile.org/vue/2.5.22/vue.min.js"></script>
<script src="https://cdn.staticfile.org/vue-router/3.0.1/vue-router.min.js"></script>
<script src="https://cdn.staticfile.org/axios/0.18.0/axios.min.js"></script>
<script src="https://cdn.staticfile.org/lodash.js/4.17.11/lodash.min.js"></script>
<script src="https://cdn.staticfile.org/echarts/4.1.0/echarts.min.js"></script>
<script src="https://cdn.staticfile.org/nprogress/0.2.0/nprogress.min.js"></script>
<!-- 富 文本编辑器的 js 文件 -->
<script src="https://cdn.staticfile.org/quill/1.3.4/quill.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue-quill-editor@3.0.4/dist/vue-quill-editor.js"></script>

<!-- element-ui 的 js 文件 -->
<script src="https://cdn.staticfile.org/element-ui/2.8.2/index.js"></script>

<% } %>
</head>

<body>
<noscript>
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>

</html>

image-20201031173914901

需要把刚刚删掉的加回来

image-20201031173949488

实现路由懒加载

npm install --save-dev @babel/plugin-syntax-dynamic-import

image-20201031174743472

image-20201031180114354

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import Vue from 'vue'
import VueRouter from 'vue-router'
// import Login from '../components/Login.vue'
// import Home from '../components/Home.vue'
// import Welcome from '../components/Welcome.vue'

// 实现路由懒加载
const Login = () =>
import ( /* webpackChunkName: "login_home_welcome" */ '../components/Login.vue')
const Home = () =>
import ( /* webpackChunkName: "login_home_welcome" */ '../components/Home.vue')
const Welcome = () =>
import ( /* webpackChunkName: "login_home_welcome" */ '../components/Welcome.vue')

// import Users from '../components/user/Users.vue'
// import Rights from '../components/power/Rights.vue'
// import Roles from '../components/power/Roles.vue'
const Users = () =>
import ( /* webpackChunkName: "users_rights_roles" */ '../components/user/Users.vue')
const Rights = () =>
import ( /* webpackChunkName: "users_rights_roles" */ '../components/power/Rights.vue')
const Roles = () =>
import ( /* webpackChunkName: "users_rights_roles" */ '../components/power/Roles.vue')

// import Cate from '../components/goods/Cate.vue'
// import Params from '../components/goods/Params.vue'
const Cate = () =>
import ( /* webpackChunkName: "cate_params" */ '../components/goods/Cate.vue')
const Params = () =>
import ( /* webpackChunkName: "cate_params" */ '../components/goods/Params.vue')

// import GoodsList from '../components/goods/List.vue'
// import Add from '../components/goods/Add.vue'
const GoodsList = () =>
import ( /* webpackChunkName: "goodslist_add" */ '../components/goods/List.vue')
const Add = () =>
import ( /* webpackChunkName: "goodslist_add" */ '../components/goods/Add.vue')

// import Order from '../components/order/Order.vue'
// import Report from '../components/report/Report.vue'
const Order = () =>
import ( /* webpackChunkName: "order_report" */ '../components/order/Order.vue')
const Report = () =>
import ( /* webpackChunkName: "order_report" */ '../components/report/Report.vue')


Vue.use(VueRouter)

const routes = [
{ path: '/', redirect: '/login' },
{ path: '/login', component: Login },
{
path: '/home',
component: Home,
redirect: '/welcome',
children: [{
path: '/welcome',
component: Welcome
},
{
path: '/users',
component: Users
},
{
path: '/rights',
component: Rights
},
{
path: '/roles',
component: Roles
},
{
path: '/categories',
component: Cate
},
{
path: '/params',
component: Params
},
{
path: '/goods',
component: GoodsList
},
{
path: '/goods/add',
component: Add
},
{
path: '/orders',
component: Order
},
{
path: '/reports',
component: Report
},
]
},
]

const router = new VueRouter({
routes
})

//挂在路由导航守卫
router.beforeEach((to, from, next) => {
// to将要访问的路径
// from代表从哪个路径跳转来
//next是一个函数,表示放行
// next()方行 next('/login') 强制跳转

if (to.path === '/login') return next()
// 获取token
const tokenStr = window.sessionStorage.getItem('token')
if (!tokenStr) return next('/login')
next()
})

export default router

项目上线

通过node创建web服务器

image-20201031182040403

在vue_shop_server文件夹下执行

npm init -y

npm i express -S

cd .. 退出

image-20201031182055694

image-20201031182304764

node .\app.js

web server running at http://127.0.0.1

开启文件的Gzip网络传输压缩

npm install compression -S 安装相应的包

image-20201031182909327

配置HTTPS服务

1
2
3
4
5
6
7
const https = require('https'); 
const fs = require('fs');
const options = {
cert: fs.readFileSync('./full_chain.pem'),
key: fs.readFileSync('./private.key')
}
https.createServer(options, app).listen(443);

使用 pm2 管理应用

①在服务器中安装 pm2:npm i pm2 -g
② 启动项目:pm2 start 脚本 –name 自定义名称
③ 查看运行项目:pm2 ls
④ 重启项目:pm2 restart 自定义名称
⑤ 停止项目:pm2 stop 自定义名称
⑥ 删除项目:pm2 delete 自定义名称

Netlify 自动化部署

使用 github 或者 gitlab 登陆 netlify

首先,打开 netlify 网站(https://app.netlify.com/)
然后使用 github 或者 gitlab 账号登录

根据 github/gitlab 仓库创建网站

点击 New site from Git 按钮 然后选择仓库所在的平台已经需要部署的仓库

注意

  • 部署分支,默认 master
  • 打包命令,诸如 npm run build,gulp build 之类
  • 打包后目录,静态资源文件夹,诸如 build dist,可不填

完成之后点击途中 deploy site 按钮

设置域名,绑定域名

部署完 netlify 会为我们随机生成一个 netlify 下的域名,我们可以更改其前缀名,然后绑定到自己的域名下。

点击 Site settings 按钮,然后在下方点击 Change site name 按钮,然后在弹出框中输入自己需要更改的前缀名,点击保存即可。
点击 Domain settings 按钮,然后在下方点击 Add custom domain 按钮,然后在弹出框中输入自己需要绑定的完整域名
这个时候会显示 !Check DNS configuration,因为我们还没有设置域名解析到 netlify 服务器,所以这个时候需要到你自己域名的相应服务商网站登录之后在需要绑定的域名下添加一条 CNAME 解析,解析的主机记录即对应的 netlify 域名值,这样就可以使用自己的域名访问自己的网站啦

生成 HTTPS 证书,实现 HTTPS 访问

点击 Verify DNS configuration 按钮,提示成功就可以用 https 访问域名了

抽离组件

面包屑导航区域

image-20201028174254720

image-20201028174433767

image-20201028174627398

image-20201028174839756