mirror of
https://github.com/zhwei820/learn.lianglianglee.com.git
synced 2025-09-17 08:46:40 +08:00
446 lines
25 KiB
HTML
446 lines
25 KiB
HTML
<!DOCTYPE html>
|
||
<!-- saved from url=(0046)https://kaiiiz.github.io/hexo-theme-book-demo/ -->
|
||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||
<head>
|
||
<head>
|
||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=no">
|
||
<link rel="icon" href="/static/favicon.png">
|
||
<title>08 无代码工具:如何做到不写代码就能高效交付?.md.html</title>
|
||
<!-- Spectre.css framework -->
|
||
<link rel="stylesheet" href="/static/index.css">
|
||
<!-- theme css & js -->
|
||
<meta name="generator" content="Hexo 4.2.0">
|
||
</head>
|
||
|
||
<body>
|
||
|
||
<div class="book-container">
|
||
<div class="book-sidebar">
|
||
<div class="book-brand">
|
||
<a href="/">
|
||
<img src="/static/favicon.png">
|
||
<span>技术文章摘抄</span>
|
||
</a>
|
||
</div>
|
||
<div class="book-menu uncollapsible">
|
||
<ul class="uncollapsible">
|
||
<li><a href="/" class="current-tab">首页</a></li>
|
||
</ul>
|
||
|
||
<ul class="uncollapsible">
|
||
<li><a href="../">上一级</a></li>
|
||
</ul>
|
||
|
||
<ul class="uncollapsible">
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/前端工程化精讲-完/00 开篇词 建立上帝视角,全面系统掌握前端效率工程化.md.html">00 开篇词 建立上帝视角,全面系统掌握前端效率工程化.md.html</a>
|
||
|
||
</li>
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/前端工程化精讲-完/01 项目基石:前端脚手架工具探秘.md.html">01 项目基石:前端脚手架工具探秘.md.html</a>
|
||
|
||
</li>
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/前端工程化精讲-完/02 界面调试:热更新技术如何开着飞机修引擎?.md.html">02 界面调试:热更新技术如何开着飞机修引擎?.md.html</a>
|
||
|
||
</li>
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/前端工程化精讲-完/03 构建提速:如何正确使用 SourceMap?.md.html">03 构建提速:如何正确使用 SourceMap?.md.html</a>
|
||
|
||
</li>
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/前端工程化精讲-完/04 接口调试:Mock 工具如何快速进行接口调试?.md.html">04 接口调试:Mock 工具如何快速进行接口调试?.md.html</a>
|
||
|
||
</li>
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/前端工程化精讲-完/05 编码效率:如何提高编写代码的效率?.md.html">05 编码效率:如何提高编写代码的效率?.md.html</a>
|
||
|
||
</li>
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/前端工程化精讲-完/06 团队工具:如何利用云开发提升团队开发效率?.md.html">06 团队工具:如何利用云开发提升团队开发效率?.md.html</a>
|
||
|
||
</li>
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/前端工程化精讲-完/07 低代码工具:如何用更少的代码实现更灵活的需求.md.html">07 低代码工具:如何用更少的代码实现更灵活的需求.md.html</a>
|
||
|
||
</li>
|
||
<li>
|
||
|
||
<a class="current-tab" href="/专栏/前端工程化精讲-完/08 无代码工具:如何做到不写代码就能高效交付?.md.html">08 无代码工具:如何做到不写代码就能高效交付?.md.html</a>
|
||
|
||
|
||
</li>
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/前端工程化精讲-完/09 构建总览:前端构建工具的演进.md.html">09 构建总览:前端构建工具的演进.md.html</a>
|
||
|
||
</li>
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/前端工程化精讲-完/10 流程分解:Webpack 的完整构建流程.md.html">10 流程分解:Webpack 的完整构建流程.md.html</a>
|
||
|
||
</li>
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/前端工程化精讲-完/11 编译提效:如何为 Webpack 编译阶段提速?.md.html">11 编译提效:如何为 Webpack 编译阶段提速?.md.html</a>
|
||
|
||
</li>
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/前端工程化精讲-完/12 打包提效:如何为 Webpack 打包阶段提速?.md.html">12 打包提效:如何为 Webpack 打包阶段提速?.md.html</a>
|
||
|
||
</li>
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/前端工程化精讲-完/13 缓存优化:那些基于缓存的优化方案.md.html">13 缓存优化:那些基于缓存的优化方案.md.html</a>
|
||
|
||
</li>
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/前端工程化精讲-完/14 增量构建:Webpack 中的增量构建.md.html">14 增量构建:Webpack 中的增量构建.md.html</a>
|
||
|
||
</li>
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/前端工程化精讲-完/15 版本特性:Webpack 5 中的优化细节.md.html">15 版本特性:Webpack 5 中的优化细节.md.html</a>
|
||
|
||
</li>
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/前端工程化精讲-完/16 无包构建:盘点那些 No-bundle 的构建方案.md.html">16 无包构建:盘点那些 No-bundle 的构建方案.md.html</a>
|
||
|
||
</li>
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/前端工程化精讲-完/17 部署初探:为什么一般不在开发环境下部署代码?.md.html">17 部署初探:为什么一般不在开发环境下部署代码?.md.html</a>
|
||
|
||
</li>
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/前端工程化精讲-完/18 工具盘点:掌握那些流行的代码部署工具.md.html">18 工具盘点:掌握那些流行的代码部署工具.md.html</a>
|
||
|
||
</li>
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/前端工程化精讲-完/19 安装提效:部署流程中的依赖安装效率优化.md.html">19 安装提效:部署流程中的依赖安装效率优化.md.html</a>
|
||
|
||
</li>
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/前端工程化精讲-完/20 流程优化:部署流程中的构建流程策略优化.md.html">20 流程优化:部署流程中的构建流程策略优化.md.html</a>
|
||
|
||
</li>
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/前端工程化精讲-完/21 容器方案:从构建到部署,容器化方案的优势有哪些?.md.html">21 容器方案:从构建到部署,容器化方案的优势有哪些?.md.html</a>
|
||
|
||
</li>
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/前端工程化精讲-完/22 案例分析:搭建基本的前端高效部署系统.md.html">22 案例分析:搭建基本的前端高效部署系统.md.html</a>
|
||
|
||
</li>
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/前端工程化精讲-完/23 结束语 前端效率工程化的未来展望.md.html">23 结束语 前端效率工程化的未来展望.md.html</a>
|
||
|
||
</li>
|
||
</ul>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="sidebar-toggle" onclick="sidebar_toggle()" onmouseover="add_inner()" onmouseleave="remove_inner()">
|
||
<div class="sidebar-toggle-inner"></div>
|
||
</div>
|
||
|
||
<script>
|
||
function add_inner() {
|
||
let inner = document.querySelector('.sidebar-toggle-inner')
|
||
inner.classList.add('show')
|
||
}
|
||
|
||
function remove_inner() {
|
||
let inner = document.querySelector('.sidebar-toggle-inner')
|
||
inner.classList.remove('show')
|
||
}
|
||
|
||
function sidebar_toggle() {
|
||
let sidebar_toggle = document.querySelector('.sidebar-toggle')
|
||
let sidebar = document.querySelector('.book-sidebar')
|
||
let content = document.querySelector('.off-canvas-content')
|
||
if (sidebar_toggle.classList.contains('extend')) { // show
|
||
sidebar_toggle.classList.remove('extend')
|
||
sidebar.classList.remove('hide')
|
||
content.classList.remove('extend')
|
||
} else { // hide
|
||
sidebar_toggle.classList.add('extend')
|
||
sidebar.classList.add('hide')
|
||
content.classList.add('extend')
|
||
}
|
||
}
|
||
|
||
|
||
function open_sidebar() {
|
||
let sidebar = document.querySelector('.book-sidebar')
|
||
let overlay = document.querySelector('.off-canvas-overlay')
|
||
sidebar.classList.add('show')
|
||
overlay.classList.add('show')
|
||
}
|
||
function hide_canvas() {
|
||
let sidebar = document.querySelector('.book-sidebar')
|
||
let overlay = document.querySelector('.off-canvas-overlay')
|
||
sidebar.classList.remove('show')
|
||
overlay.classList.remove('show')
|
||
}
|
||
|
||
</script>
|
||
|
||
<div class="off-canvas-content">
|
||
<div class="columns">
|
||
<div class="column col-12 col-lg-12">
|
||
<div class="book-navbar">
|
||
<!-- For Responsive Layout -->
|
||
<header class="navbar">
|
||
<section class="navbar-section">
|
||
<a onclick="open_sidebar()">
|
||
<i class="icon icon-menu"></i>
|
||
</a>
|
||
</section>
|
||
</header>
|
||
</div>
|
||
<div class="book-content" style="max-width: 960px; margin: 0 auto;
|
||
overflow-x: auto;
|
||
overflow-y: hidden;">
|
||
<div class="book-post">
|
||
<p id="tip" align="center"></p>
|
||
<div><h1>08 无代码工具:如何做到不写代码就能高效交付?</h1>
|
||
<p>在开始今天的课程前,我们先来简单回顾下上节课的思考题:低代码工具主要面向什么样的用户群体呢?低代码工具本质上是对组件化开发流程的简化,但在开发过程中,仍然可能进行编码调试。因此,它面向的用户群体应该是具有一定技术基础的开发人员,专业的后端开发也可以使用这类工具来快速开发项目中的前端功能。</p>
|
||
<p>在介绍低代码开发的时候,经常伴随出现另一个名词:<strong>无代码开发</strong>。今天我们就来近距离地了解这种开发模式的相关知识。</p>
|
||
<h3>无代码开发模式的出现</h3>
|
||
<p>在讨论无代码开发之前,我们先来看下这种开发模式出现的原因:</p>
|
||
<ol>
|
||
<li><strong>有需求量大且更新频率快的小型项目</strong>:例如不同主题内容的运营活动页面、招聘页面等。</li>
|
||
<li><strong>这些项目流程模式基本相同但又具有一定的定制性</strong>:例如一个优惠券活动,需要投放到不同城市,因此文案内容、图片背景和优惠券金额等都可能不同。</li>
|
||
<li><strong>开发人员成本昂贵,供不应求</strong>:尽管开发人员可以通过代码复用等方式来提升开发类似代码的效率,但是总体而言这类简单项目从定制开发到上线的流程,仍然以天为单位,在面对大量雷同的项目时,开发效率仍不能满足用户方的需求。</li>
|
||
<li><strong>非互联网企业缺少技术资源</strong>:许多非互联网中小型企业内部缺少完整的技术团队,无法通过自身技术资源解决日常的互联网开发需求。</li>
|
||
</ol>
|
||
<p>无代码开发模式正是为这些问题而量身定制的。</p>
|
||
<h3>无代码开发介绍</h3>
|
||
<p><strong>无代码开发</strong>(<strong>No-Code Development / Codeless Development</strong>)是指通过非手写代码工具来产出代码的方式。这类工具被称为:<a href="https://en.wikipedia.org/wiki/No-code_development_platform">无代码开发平台</a><strong>(No-Code Development Platform,NCDP)</strong>。</p>
|
||
<h4>无代码开发和低代码开发的区别</h4>
|
||
<p>从下面的表格中可以看到无代码开发和低代码开发的主要区别,包括目标人群、目标产品、开发模式等 7 个维度。</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th><strong>区别维度</strong></th>
|
||
<th><strong>低代码开发</strong></th>
|
||
<th><strong>无代码开发(面向非开发)</strong></th>
|
||
<th><strong>无代码开发(面向准开发)</strong></th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td><strong>目标人群</strong></td>
|
||
<td>主要面向有一定技术基础的开发人员</td>
|
||
<td>主要面向非开发岗位人员(例如运营人员,设计人员)</td>
|
||
<td>主要面向准开发人员(对开发思维的需求随项目难度递增)</td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>目标产品</strong></td>
|
||
<td>主要为 B 端中后台</td>
|
||
<td>主要为 C 端活动或 H5</td>
|
||
<td>结合前两者</td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>开发模式</strong></td>
|
||
<td>编写 JSON/操作图形化交互平台(偏重前端)</td>
|
||
<td>操作图形化交互平台(偏重前端)</td>
|
||
<td>操作图形化交互平台(前端到后端)</td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>基础设施</strong></td>
|
||
<td>通用的组件库与渲染流程</td>
|
||
<td>典型的页面/项目模板,以及与视觉呈现相关的组件</td>
|
||
<td>前后端组件</td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>可自由定制的内容</strong></td>
|
||
<td>组件的选择、布局、属性、数据、交互</td>
|
||
<td>可视化数据(文本、媒体、动画等)的编辑</td>
|
||
<td>前端可视化数据,后端数据与逻辑功能等</td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>数据接口</strong></td>
|
||
<td>通常由独立后端单独开发提供</td>
|
||
<td>无数据接口,或通常由平台方提供标准化的接口</td>
|
||
<td>基于云基础设施的数据功能</td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>部署</strong></td>
|
||
<td>可单独部署</td>
|
||
<td>通常由平台方提供云服务部署</td>
|
||
<td>通常由平台方提供云服务部署</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p>其中,可以把市面上的<strong>无代码开发模式</strong>进一步<strong>细分为两类</strong>:</p>
|
||
<ul>
|
||
<li><strong>一类完全面向非开发人员</strong>,如百度 H5,对应开发的目标产品主要是模式化的 C 端活动与其他 H5 页面类型(例如招聘页面,测试小游戏等);</li>
|
||
<li><strong>另一类面向准开发人员</strong>,即缺少代码经验且希望开发全栈产品的个人或团队,在目标产品和定制功能上更全面,但是相应的学习使用成本也更高,这类产品以 iVX 为代表。</li>
|
||
</ul>
|
||
<p>下面,我们就来进一步了解下这两种开发模式的异同。</p>
|
||
<h3>典型产品分析</h3>
|
||
<h4>面向非开发人员的无代码开发产品</h4>
|
||
<p>这类产品的设计目标就是将一些固定类型的项目生产流程,由代码开发转变为操作图形化交互工具。</p>
|
||
<p><strong>企业内部的定制化搭建平台</strong></p>
|
||
<p>例如面向 C 端的企业经常会有推广拉新的开发需求,以红包活动为例,如果按照普通的代码开发流程,需要经历以下 6 个流程才能最终上线:</p>
|
||
<ol>
|
||
<li>产品确定活动流程,交付产品文档与原型。</li>
|
||
<li>设计师设计页面,交付设计稿。</li>
|
||
<li>前端工程师开发活动的前端代码。</li>
|
||
<li>后端工程师开发活动的后端代码。</li>
|
||
<li>前后端联调后交付测试。</li>
|
||
<li>测试通过后部署上线。</li>
|
||
</ol>
|
||
<p>这类活动通常是可复用的,然而针对不同时间段,或者同一时间段的不同推广渠道和推广地区,通常需要提供模式相同但外观与数据(例如红包金额)不同的活动产品,于是当需要复用时,会发现除了产品交付的流程不用变更外,后续所有开发部署流程都难以避免。这导致<strong>开发资源被低效地占用,生产效率也无法进一步提升</strong>。</p>
|
||
<p>而无代码开发产品可以完美地解决这一类问题,针对同一类型的活动项目,前后端工程师可以开发出对应的可视化活动搭建平台,提供:</p>
|
||
<ol>
|
||
<li>选择活动类型并预览效果的功能。</li>
|
||
<li>文本、图片、活动金额、上下线时间等元素替换功能。</li>
|
||
<li>数据统计等辅助模块。</li>
|
||
</ol>
|
||
<p>这种方法通过一次开发,即可让运营人员长期重复使用,解放了后续的开发资源,并且从流程上将普通项目开发的 6 个环节简化为两个环节:设计师设计页面,以及运营人员无代码地编辑内容。这将原先以天为单位的开发部署时间,缩短为以分钟为单位的编辑生成时间。</p>
|
||
<p>以上便是<strong>企业内部无代码开发</strong>的一类应用场景。</p>
|
||
<p><strong>外部无代码搭建平台</strong></p>
|
||
<p>另一类面向非开发人员的无代码开发产品,针对的是缺乏开发资源的企业和部门。对于一些常见的小型项目需求,例如招聘页面、报名页面等,它们往往需要借助<strong>外部提供的无代码开发平台</strong>。这类无代码开发平台包括百度 H5、MAKA、易企秀等。</p>
|
||
<p><img src="assets/Ciqc1F9R0u-ABNY5ABlh1mN5IXo611.png" alt="image" /></p>
|
||
<p>百度 H5 编辑界面</p>
|
||
<p>这类产品的特点是:</p>
|
||
<ul>
|
||
<li><strong>场景类型固定</strong>:通常提供一些企业常见类型页面生成(招聘介绍、报名表单、宣传活动、答题测试等)。</li>
|
||
<li><strong>设计模板丰富</strong>:通常都提供了大量经过设计的页面模板供用户选择,部分平台还提供了第三方设计师设计与发布设计模板的功能。</li>
|
||
<li><strong>定制化功能多样</strong>:除了常见的文本和图片类型外,这类产品的 IDE 中通常还包含了媒体、表单、动画等多维度编辑功能。</li>
|
||
<li><strong>后端功能较少</strong>:产品形态大多是纯前端的,即使涉及后端数据,例如表单提交,也只提供了基于云平台的上报数据统计,在 IDE 中没有自定义后端接口和数据字段的部分,这也和使用人群的定位一致。</li>
|
||
<li><strong>部署在云端</strong>:通常都提供免费或收费的云端部署方案,以降低用户运维难度和操作成本。</li>
|
||
<li><strong>使用人群细化</strong>:使用人群进一步分化为设计师与普通使用者。对于普通使用者而言,除了开发资源外,通常也不具备设计资源。于是设计师就可以使用平台提供的 IDE 工具,发布付费设计模板,供普通使用者选择。</li>
|
||
</ul>
|
||
<h4>面向准开发人员的无代码开发产品</h4>
|
||
<p>而面向准开发人员的无代码开发产品,则有以下几点不同:</p>
|
||
<ul>
|
||
<li><strong>更为多样化的应用场景</strong>:同上述面向非开发人员的产品相比,这类产品最主要的功能是提供了描述性的后端的数据与功能模块,因此能够实现的应用场景也更为多样化和通用化。以 iVX 为例,可实现的应用场景从上面的 C 端产品扩展到了 B 端产品,包括:小程序、小游戏、H5、营销活动,BPM、OA、CRM、ERP,企业中台,BI、大屏幕等。</li>
|
||
</ul>
|
||
<p><img src="assets/CgqCHl9R0v-ASMv2AAQk8slb6Xc485.png" alt="image" /></p>
|
||
<p>iVX 编辑器中后端逻辑描述面板</p>
|
||
<ul>
|
||
<li><strong>目标人群的变化</strong>:应用场景扩展对应的是 IDE 功能的复杂化和操作学习成本的增加,于是目标人群也多少有些不同:
|
||
<ul>
|
||
<li>从一方面来看,这种功能增强型的无代码模式能够吸引更多有产品思维但缺少实际开发经验的个人或缺少开发资源的团队尝试使用,例如外包团队或早期创业团队。</li>
|
||
<li>但从另一方面看,要开发一个具有一定复杂度的项目,对开发人员的要求不只体现在代码能力方面,还需要开发人员对产品、全栈架构与交互逻辑层面有一定的认识和理解。无代码平台主要解决的是前一个层面的问题,对于后者,则仍然受到使用者的技术经验限制。这也在一定程度上也会造成无形的使用壁垒。</li>
|
||
<li>此外,使用者对这类全新的开发工具和流程的开发经验的掌握,很难迁移到其他开发工具和流程中,这也可能使使用者产生是否值得学习这类工具的疑虑。也许直到这类产品在市场中得到充分的验证,培养出足够多的使用者和需求方后,才能真正解决担忧。</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<h3>总结</h3>
|
||
<p>这节课我们介绍了和低代码开发对应的另一种开发模式:无代码开发。首先我们对比了两种开发模式不同维度的区别,又进一步介绍了无代码开发的两种不同方向:面向非开发人员的产品与面向准开发人员的产品。</p>
|
||
<p>面向非开发人员的无代码开发在企业内部与外部都有相应的应用场景:在企业内部我们可以将一些频率高的常用简易开发流程,固化为无代码开发产品,供运营或其他岗位人员使用;而在企业外部,也有不少免费或收费的无代码平台,将开发工具提供给缺乏技术资源的企业与个人;同时,设计师也可以在这类平台上制作自己的设计模板提供给用户。</p>
|
||
<p>面向准开发人员的无代码产品相比之下具有更广泛的使用场景,通过提供后端数据与逻辑的描述功能,用户可以通过 IDE 开发出具备前后端数据交互的复杂应用,进一步减少与普通代码开发的功能边界的差距。但相对的,要利用工具实现复杂应用,对用户的学习成本和思维培养也是一种新的挑战。究竟这种模式是否能被更多企业所接受,成为代码开发模式的替代呢?让我们拭目以待。</p>
|
||
<p>通过这一课,希望作为前端工程师的你能够在工作中考虑无代码开发的第一种应用场景,在合适的场景下开发相应的工具,来解放团队的开发资源,提升效率。而对于外部的无代码开发平台,如果感兴趣,希望你进一步了解,或许能对普通代码开发的模式有所借鉴。</p>
|
||
<p>最后,随着这一课的结束,我们就完成了开发效率篇的所有课程。今天的思考题是回顾本模块的内容,学会在工作中运用,如有疑问,欢迎你写在留言区。</p>
|
||
<p>下节课我们将进入第二个模块:构建效率篇。一起深入了解你所使用的构建工具中有哪些影响效率的知识点。</p>
|
||
</div>
|
||
</div>
|
||
<div>
|
||
<div style="float: left">
|
||
<a href="/专栏/前端工程化精讲-完/07 低代码工具:如何用更少的代码实现更灵活的需求.md.html">上一页</a>
|
||
</div>
|
||
<div style="float: right">
|
||
<a href="/专栏/前端工程化精讲-完/09 构建总览:前端构建工具的演进.md.html">下一页</a>
|
||
</div>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
|
||
</div>
|
||
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v652eace1692a40cfa3763df669d7439c1639079717194" integrity="sha512-Gi7xpJR8tSkrpF7aordPZQlW2DLtzUlZcumS8dMQjwDHEnw9I7ZLyiOj/6tZStRBGtGgN6ceN6cMH8z7etPGlw==" data-cf-beacon='{"rayId":"709977581bc53cfa","version":"2021.12.0","r":1,"token":"1f5d475227ce4f0089a7cff1ab17c0f5","si":100}' crossorigin="anonymous"></script>
|
||
</body>
|
||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-NPSEEVD756"></script>
|
||
<script>
|
||
window.dataLayer = window.dataLayer || [];
|
||
|
||
function gtag() {
|
||
dataLayer.push(arguments);
|
||
}
|
||
|
||
gtag('js', new Date());
|
||
gtag('config', 'G-NPSEEVD756');
|
||
var path = window.location.pathname
|
||
var cookie = getCookie("lastPath");
|
||
console.log(path)
|
||
if (path.replace("/", "") === "") {
|
||
if (cookie.replace("/", "") !== "") {
|
||
console.log(cookie)
|
||
document.getElementById("tip").innerHTML = "<a href='" + cookie + "'>跳转到上次进度</a>"
|
||
}
|
||
} else {
|
||
setCookie("lastPath", path)
|
||
}
|
||
|
||
function setCookie(cname, cvalue) {
|
||
var d = new Date();
|
||
d.setTime(d.getTime() + (180 * 24 * 60 * 60 * 1000));
|
||
var expires = "expires=" + d.toGMTString();
|
||
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
|
||
}
|
||
|
||
function getCookie(cname) {
|
||
var name = cname + "=";
|
||
var ca = document.cookie.split(';');
|
||
for (var i = 0; i < ca.length; i++) {
|
||
var c = ca[i].trim();
|
||
if (c.indexOf(name) === 0) return c.substring(name.length, c.length);
|
||
}
|
||
return "";
|
||
}
|
||
|
||
</script>
|
||
|
||
</html>
|