微信小程序技术总结小程序单向数据流单向数据流就是从逻辑层到视图层,vue也是单向数据流Modelview,但是实

客户不知道小程序如何注册的情况下,需要大概告知操作界面在哪。

进入公众号找的小程序管理,选择快速注册小程序即可进行注册。

根据提示进行账号注册。

添加完成之后即可开发小程序了。

pages用来存放所有小程序页面。

utils用来存放工具性质的模块。

api统一管理api接口。

其余的文件根据项目需要进行划分,如components文件就是存放公共组件模块。

app.json是小程序的全局配置,包括了小程序的所有页面路径,窗口外观,底部tab等。当中的style字段这是样式版本,加上style和删除style,这样会使用小程序组件样式是不一样。

project.config.json是项目配置文件,记录小程序开发工具所做的个性化配置,如项目名称,小程序账号ID等

页面中的json小程序每个页面中的json,配置本页面的窗口外观,会覆盖app.json的window中相同配置项。

1.加载解析页面的json文件配置。

2.加载页面wxml和wxss样式。

3.执行页面js文件,调用Page()创建页面实例。

4.页面渲染完成。

单向数据流就是从逻辑层到视图层,vue也是单向数据流Model-view,但是实现了双向数据绑定。而小程序没有做劫持代理,所以不能进行双向数据绑定。但现在小程序是有双向数据绑定这个概念的,叫简易的双向数据绑定。

需求:logo需要同右边的胶囊按钮顶部对齐。

解决方法:使用wx.getMenuButtonBoundingClientRect()

输出下wx.getMenuButtonBoundingClientRect(),可以看见胶囊按钮的信息,需要注意的是单位为px。

wx.getMenuButtonBoundingClientRect().top就能获取到胶囊按钮距离信息栏的距离,然后将px转为rpx。

解决办法:wx.createSelectorQuery()

注意两点:

1.要在ready函数中执行

2.在组件中使用wx.createSelectorQuery()之后,要用in()来指定范围。(将选择器的选取范围更改为自定义组件component内)或者在自定义组件或包含自定义组件的页面中,应使用this.createSelectorQuery()来代替

直接在this.setData中直接修改,编译器会显示波浪线报错。

data:{list:{deleted:false,name:"设计模块"}}//对象.属性名:修改的值this.setData({'list.deleted':true})修改数组data:{list:[{id:1,deleted:false},{id:2,deleted:false},{id:3,deleted:false}]}this.setData({'list[0].deleted':true})或者加入变量使用,用字符串拼接起来。

data:[{"id":0,"name":'zs'},{"id":1,"name":'ddds'}]letnewData="data["+0+"].name"this.setData({[newData]:"张三"})console.log(this.data.data)注:修改对象和数组都要用''包括起来

但下标总不能写死了,所以循环下就行了,主要就是赋值给新的变量,在新变量中进行修改数据,再进行this.setData。

第一步:进入eCharts官网点击下载选择下载,进入在线制定。按需要下载,减少体积

第二步:点击在线制定

第三步:选择需要的图形

第四步:下载

用ec-canvas文件就行

第七步:将ec-canvas文件放入项目中

我这里是在组件中创建了echarts文件夹,就把ec-canvas文件中的文件全部放进去。注意如果是按需制定的echarts,将echarts.js替换成在线制定生成的echarts.min.js。

同时修改ec-canvas.js中的import*asechartsfrom'./echarts'的引用文件。

第八步使用

配置组件使用

"usingComponents":{"ec-canvas":"../echarts/ec-canvas"}视图层

//引入eChartsimport*aseChartsfrom'../../components/echarts/echarts'data:{ec:{onInit:initChart},}functioninitChart(canvas,width,height){//绘制宽高letchart=echarts.init(canvas,null,{width:width,height:height});canvas.setChart(chart);//容器初始化echarts.registerMap('china',geoJson);//地图数据注册letoption={}chart.setOption(option);//返回初始化结果returnchart;}另外一种封装成组件

逻辑层

/***组件的初始数据*/data:{ec:{onInit:null},},//在组件实例进入页面节点树时执行attached:function(){this.setData({ec:{onInit:this.initChart}})},/***组件的方法列表*/methods:{//eCharts可视化地图initChart:function(e,width,height){//绘制宽高地图模糊时候使用devicePixelRatio调整清晰度constchart=eCharts.init(e,null,{width:width,height:height,devicePixelRatio:2.5});//容器初始化e.setChart(chart);//地图数据注册eCharts.registerMap('china',geoJson);//初始化数据letoption={}chart.setOption(option);//返回初始化结果returnchart;},大致效果:

wx.navigateTo打开页面最多只能打开10个,超过10个之后就没反应。

//导航列表跳转对应页面handleNavigate:function(e){//获取全局变量constapp=getApp()//获取全局变量中adCenterPitchOn的值letadCenterPitchOn=app.globalData.adCenterPitchOn//判断如果当前选中的id与全局变量中adCenterPitchOn不相等进行跳转,相等就不进入跳转程序,减少重复跳转。if(e.currentTarget.dataset.id!=adCenterPitchOn){this.setData({pitchOn:e.currentTarget.dataset.id})//navigateTo跳转不能打开10个页面,需要进行判断超过10个页面就关闭所有页面,重新进行页面栈个数统计letpages=getCurrentPages()//获取当前打开的页面letpagesLength=pages.length//获取当前打开页面的数量//打开页面数量大于等于10使用reLaunch关闭所有页面,重新进行页面栈个数统计。if(pagesLength>=10){wx.reLaunch({url:e.currentTarget.dataset.path,})}else{//小于10就使用navigateTowx.navigateTo({url:e.currentTarget.dataset.path,})}}}这里不直接使用reLaunch是因为会重新渲染,跳转一次屏幕就会有闪动。所以进行粗糙的处理到了10个页面,使用reLaunch,十次之后才会闪动一次。

第一步:开启tabBar自定义

在app.json中找的tabBar加入custom:true

同时官方文档建议还是将list内容写上,用来兼容低版本。

第二步:创建目录

创建custom-tab-bar与pages同级。

第三步:custom-tab-bar中wxml编写

创建一个工具类,用来处理custom-tab-bar切换

点击时触发,进行跳转

getTabBarIndex:function(e){//获取当前点击的下标及位置consttabBarData=e.currentTarget.datasetconstpresentPath=tabBarData.pagepath//跳转到对应页面,并关闭其他所有非tabBar页面wx.switchTab({url:presentPath,})}第五步:调用及高亮不变处理

在tab页引入consttabService=require("../../utils/tab-service");

ios和android显示的效果会有差异,这就需要通过识别机型进行适配。

在app.js中使用wx.getSystemInfoSync().platform获取手机型号

onLaunch(){//获取机型constres=wx.getSystemInfoSync().platform//将机型放进缓存if(res=='ios'){wx.setStorageSync('facility',"ios")}else{wx.setStorageSync('facility',"android")}},真机测试才行,模拟测试值是devtools

//导入服务器配置信息importconfigfrom'../config/config'exportdefault(url,data,method='GET')=>{//初始化Promise实例returnnewPromise((resolve,reject)=>{wx.request({url:config.host+url,data,method,success:(res)=>{//成功之后修改Promise状态resolve(res)},fail:(err)=>{//失败之后修改Promise状态reject(err)}})})}使用方法:

importreqfrom'../../utils/request'//引入封装的地址onLoad:asyncfunction(){//获取数据letpageImgData=awaitreq('/cas/query')},关于传值的方法全局变量使用在app.js中使用globalData定义全局变量。

//定义全局变量globalData:{userInfo:null,tabBarIndex:0,}app.globalData.变量名获取定义的变量值

//获取全局变量constapp=getApp()console.log(app.globalData.tabBarIndex)//直接修改变量,不需要setDataapp.globalData.tabBarInde=1父组件传值给子组件父组件使用子组件,传入父组件定义的值:tableHeaderData和tableList

/***组件的属性列表*/properties:{//列表表头数据tableHeader:{type:Array,value:[],},//列表数据tableList:{type:Array,value:[]},},父组件没有传值,子组件也不会报错。所以父组件可以按需传入相应得值。

//将值传给父组件this.triggerEvent("getLogHeight",62)父组件接收子组件传入的值

//设置缓存,传入数据wx.setStorageSync('facility',2)//获取缓存下的值wx.getStorageSync('facility')页面跳转传值wx.navigateTo({url:'xxxdata='+this.data.job,})接收参数:

解决方案:引入wxs模块实现

根据开发场景使用,这里就单独创建一个wxs,放入工具文件夹中。

wxs中写入方法

functionftoFixed(num){returnnum.toFixed(2);}module.exports.ftoFixed=ftoFixed;wxml中使用wxs

保留小数点稍微完善版:

接收后端传入的数据,将字符串显示成html格式内容。

可是使用rich-text

解决办法:使用wxPars

将下载好的文件放入小程序中,放的位置看你心情。

在需要的功能模块下引入js文件。

js中进行数据绑定

/*1.bindName绑定的数据名(必填)*2.type可以为html或者md(必填)*3.data为传入的具体数据(必填)*4.target为Page对象,一般为this(必填)*5.imagePadding为当图片自适应是左右的单一padding(默认为0,可选)*/WxParse.wxParse(bindName,type,data,target,imagePadding)letthat=thiswx.request({url:'',header:{'Content-Type':'application/json',},success:res=>{letarticle=res.data.objWxParse.wxParse('article','html',article,that,0);}})引入WxParse.css,可以在app.wxss引入,建议在需要模块的wxss样式文件中单独引用,不要全局使用,减少样式冲突。

在wxml文件中引入模板

使用模板,.nodes不要去掉。

如果head标签里有样式,这里会直接显示样式代码。

按照以往风格,简单粗暴的解决:在wxss文本中加入下面代码

.card_service_ul>.WxEmojiView.wxParse-inline{display:none;}.wxParse-head{display:none;}模拟器数据正常显示,真机测试获取不到数据这个问题有可能是后端同学限制了接口访问IP,造成真机测试时接口调用失败。

获取md5js源文件,源文件百度可以找到,因为审核不通过这里就不放了。

将md5源文件放入工具文件夹中

constmd5=require('../../utils/md5')可以直接使用md5加密,也可以拼接之后再加密,这里看后端是怎么要求的。

后端会给一些字段,直接存入数组中

data:{//里面存放后端需要的字段mdValue:[x,x,x,x,x,x,x,x,x,x,x,x,x]},进行拼接,将密码和数组中的字段拼接一起。注意这里的拼接方式后端规定,前端按照格式进行拼接即可。

letuserPwdStr=this.data.mdValue[4]+this.data.mdValue[5]+this.data.userPwd+this.data.mdValue[3]+this.data.mdValue[6]最后使用md5加密

md5(userPwdStr)base-64加密js放入工具文件夹中,源文件百度可以找到,因为审核不通过这里就不放了。

引入js

constbase64=require('../../utils/base64')直接使用

base64.base64_encode('xxxxx')如果后端有加密要求根据后端的规则进行加密。

底部图标大小不要超过30kb,如果超过小程序就会报错,15kb其实差不多就可以了。

当复用小程序整体代码,只是替换图片时,另起一个项目注意替换原来的appid。

在需要的页面中的json文件中简单配置下即可,app.json设置无效。

sharePhone字段自己定义就行。

代码中也需要进行配置:

在需要播放的页面中找到json文件,配置下视频插件。

"usingComponents":{"txv-video":"plugin://tencentVideo/video"}在wxml文件中加入代码:

关于视频需要申请一个企业账号,进行主体认证等操作。然后上传视频到腾讯视频,审核通过就行。

获取视频链接,右键视频点击视频信息

嵌入代码打开里面的vid就是o33401kc9b1跟上面的一样。

小程序有自带的人工客服,组件button加上open-type=“contact”属性,客服人员在小程序后台添加就行。

wx:for="{{book}}"默认是item

进行修改方法:wx:for-item="dataLiet"就可以使用dataLiet。

下标index也是wx:for自带的,可以进行修改wx:for-index="idx"就可使用idx

注意使用wx:for记得加上wx:key="index"可以换成后端传入的id。

1.使用外部链接进行引用(动态加载网络字体)

代码放在app.js中或者需要使用到的模块js中

font-family:"PingFang"!important;需要注意一点就是ios系统可以正常获取到字体,但是在安卓手机中会失败。这就需要进行配置,进入服务器找nginx配置,站点配置文件加入以下代码,开启cros支持,然后重启下nginx。

这里造成安卓手机失败的原因是字体链接访问需满足浏览器同源策略,字体文件资源设置CORS的Access-Control-Allow-Origin为小程序域名:servicewechat.com或者*

该行代码的含义为在HTTP响应中添加一个名为"Access-Control-Allow-Origin"的头部字段,这个头部字段的作用是指定允许访问资源的源,即哪些域名可以与服务器进行跨域请求;

如果是使用的宝塔的配置如下

location~.(eot|otf|ttf|woff|woff2|svg)${add_headerAccess-Control-Allow-Origin*;add_headerContent-Typefont/ttf|font/woff|font/woff2;}根据配置文件来设置。

解决安卓特殊字体失败问题还有一种方法就是字体文件转base64。

1.点击按钮Addfonts(添加字体)

2.将Base64encode按钮打开,下面的Formats按钮按需要选择。

3.转换好后点击Download下载

下载成功之后的压缩包。

解压后:

我大概看了一下大小比原来字体的还要大一些,所以个人觉得没必要安卓和IOS两套写法,直接在服务器配置文件就好了。

解决方法:删除掉app.json里面的

"lazyCodeLoading":"requiredComponents",

或者降低基础库的版本。

代码层级没有问题,却无法获取到手机信息

合法已经域名配置了,但小程序报错ERR_SSL_PROTOCOL_ERROR,直接找后端解决,代理啥的配置绝对有问题。

THE END
1.教育在线平台系统开发的全面解析与构建指南随着互联网技术的飞速发展,在线教育已成为教育行业的重要趋势。教育在线平台系统作为在线教育的重要载体,其开发质量和功能设计直接关系到教学效果和学习体验。本文将从需求分析、技术选型、功能设计、用户体验优化等方面,全面解析教育在线平台系统的开发过程,为教育机构和企业提供一份实用的构建指南。 https://www.pbids.com/aboutUs/pbidsNews/1861300381826519040
2.App页面元素分层式导航1.4 抽屉式导航 一般采用将导航主题隐藏在App侧边的方式,以一个按钮来呼出导航,在使用完成之后再使用相同的按钮隐藏起来。一般用于底部没有导航栏,而且使用比较少的功能都收纳起来,如我的。 1.5 沉浸式导航 又叫 内容驱动式导航 或 体验驱动式导航,是沉浸式设计的一种表现,在内容中自由的转换,或是内容本身定义导https://blog.csdn.net/vbirdbest/article/details/142083906
3.网站设计,探索与创新之路云设计小黄狮随着移动设备的多样化,跨平台整合设计将成为未来的趋势,设计师需要考虑到不同设备和平台的特点,提供一致的用户体验,跨平台整合设计将有助于提高网站的可用性和访问量。 网站设计形式对于网站的成功具有重要影响,设计师需要不断关注最新的设计理念和技术趋势,不断创新和改进设计形式,以提高用户体验和网站的访问量,在未来https://www.vvrcloud.com/post/20774.html
4.梦学谷在线教育平台,知识付费,博客社区,倍速视频播放,支付宝微信uni-app是一个使用Vue.js开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/QQ/钉钉/淘宝)、快应用等多个平台。 DCloud公司拥有600万开发者用户,几十万应用案例、12亿手机端月活用户,数千款uni-app插件、70+微信/qq群。 https://ext.dcloud.net.cn/plugin?id=5341
5.万字干货!超全面的小程序设计指南优设网豆瓣评分提供最新的电影介绍及评论。豆瓣是典型的有情怀,小而美的产品了。 你们不知道的小程序 1. 弹窗不能覆盖导航栏 因为在小程序里导航栏的层级是最高的,即使隐藏导航栏 Title Bar 也是依然存在的。 半屏弹窗 除了官方指南里的模态对话框,也可以尝试半屏弹窗,一是承载更多信息,二是更好的继续流程不被打断。 https://www.uisdc.com/mini-program-design-guide
6.以Web为基础10篇(全文)学生登录系统不但可以在线点播课程课件及多媒体视频、浏览教学信息资源, 还可参加实时的教学互动视频课堂、课程讨论及测验考试;教师不但可使用学生的所有功能, 还可查看统计学生的学习档案, 组织管理内部的学习资源, 为教师对学生素质进行公正评价及正确分析提供有力平台支持。[3]https://www.99xueshu.com/w/ikeyqzszmwjy.html
7.福建省应急管理厅门户网站改版和运营服务项目附件资格承诺函(若有) 参照《福州市财政局关于进一步推进政府采购领域优化营商环境工作的通知》(榕财采〔2021〕52号)“四、简化资格证明材料”的相关规定:(1)供应商在响应文件中可自行选择是否提供资格承诺函 (格式详见附件),若按附件内容要求提供资格承诺函,无需在投标文件中提交财务状况、缴纳税收和社保资金缴纳证明材https://zfcg.czt.fujian.gov.cn/upload/document/20221123/544811a0bef040bd8c5bfb3c756e9d1d.html
8.新媒体客户端(精选十篇)新媒体客户端包括前台APP和后台管理发布平台两部分。前台APP包括欢迎页、栏目列表、首页栏目、用户登录、用户注册等,后台包括采编管理、发布管理、栏目管理、互动管理、素材管理、群组推送等。如图1所示。 2.2 界面 接下来介绍下首页、导航栏、社情民意等几个主要功能模块的界面设计。 https://www.360wenmi.com/f/cnkey227gz22.html
9.iOS16导航栏titleView适配UINavigationBarTitleControl本文只涉及 iOS 16 Beta中出现的导航栏异常 我们一般配置自定义导航栏会用到 navigationItem.titleView,在iOS 16 Bata的适配过程中发现导航栏的自定义titleView会出现位置、尺寸、透明度配置异常。 1. navigationItem.titleView 位置异常问题 1.1 查看导航栏层级 https://www.jianshu.com/p/3382e5629b9a
10.导航栏还是侧栏?flutter跨平台适配指南平台差异:在某些平台上,特别是移动设备上,侧栏可能不易于使用或者不符合用户的习惯。 风格一致性:侧栏的设计和使用需要更多的注意,以确保其与应用的整体风格和用户体验保持一致。 何时应该选择导航栏? 应用功能简单:当应用功能较少,主要包含几个核心页面时,可以选择使用导航栏,保持界面简洁明了。 https://blog.51cto.com/techfanyi/10427181
11.5种内容筛选种类以及如何选择类型理论文摘处于页面的底部导航栏的位置 当用户出发操作的时候,内容从下往上弹出展示。 5. 抽屉式筛选 电商平台应用较多的分类形式,通常是有两个分类层级,一、二级的分类类目都比较多,默认情况下,如果分类特别多时可以只展示第一层级信息,用展开收起辅助用户浏览二级类目信息。 http://www.333cn.com/shejizixun/201917/43496_148326.html
12.b2b分类信息(属于b2b平台的是)联创号阿里巴巴的网站有些不同。左侧固定栏为页面导航,右侧固定栏有个人主页、个人足迹、新闻、发布新信息、返回顶部等快捷方式。可以看出,由于Alibaba.com是一个B2B平台,用户的个人中心是一个重要的存在。在购买过程中,买家可能要随时查看自己的购买信息,所以相比Taobao.com,它增加了一个关于个人中心的浮动固定栏目。 https://www.lian-bj.com/lc/?p=76339
13.26篇博文含有标签「版本甄知科技ITSM猪齿鱼效能平台 V1.1 主要新特性 1. 新增在线工作日历,支持Outlook、Google等本地日历订阅,快速掌握工作项安排? 猪齿鱼工作日历将个人工作项及不同项目工作项以时间维度集中在一处,在在线日历中查看工作,使团队间能够快速同步工作。工作日历更是项目工作项可视化的利器,使业务任务和项目协作变得更加透明可视化?,一http://www.zknow.com/choerodon/blog/tags/%E7%89%88%E6%9C%AC/
14.站长号平台:站长要知道网站优化的核心是用户体验大多数网站都有导航栏。这大大增加了用户的便捷,有了导航栏用户不仅可以快速找到自己想要的栏目,搜索引擎也可以快速抓取和理解网站的结构层级。 3.要注重网站的加载速度 某项数据表明,如果网站的加载速度超过了12秒,那么用户极可能直接关闭网站。加载速度不仅决定了用户是否停留在我们的网站,还决定了搜索引擎抓取的速度https://weibo.com/ttarticle/p/show?id=2309404837148229763622
15.侧边栏分页和步骤条的一些设计思考杂时代1.4 层级划分 因为侧边导航栏中有树形结构,一个主级别可以分散为多个子级别,所以就需要划分一下层级。划分层级的方法也有很多,可以改变字号、改变颜色、改变字形、改变距离,那我用的方法是改变距离。采用哪种方法还是要看具体需求,像那种需要想突出层级且对比强烈的需求,可以采用改变字号和改变字形(加粗)。下图中颜色http://zatime.com/6391.html
16.品牌网站建设中的网站布局与结构设计一个好的网站结构应当有合理的页面层级,让用户可以清晰地理解网站的整体框架和信息组织。合理的页面层级可以使用户通过导航栏或面包屑导航快速定位和跳转到目标页面。同时,合理的页面层级也能够便于搜索引擎索引和收录网站的各个页面。 2. 规范的命名和链接 https://www.jijinweb.com/news/brand-website/12981.html
17.小黑盒导航栏的形式多样,可以是简单的文字链接,也可以是设计精美的图片或是丰富多彩的按钮,还可以是下砬菜单导航。 一般来说,网站中的导航位置在各个页面中出现的位置是比较固定的,而且风格也较为一致。导航的位置一般有4种:在页面的左侧、右侧、顶部和底部。有时候在同一个页面中运用了多种导航。当然并不是导航在页面https://xiaoheihe.cn/community/7214/list/98998379
18.小程序主商城介绍·微信小程序商城使用教程(定期更新)·看云小票打印、发货、退换货、门店核销员绑定/门店核销、模版消息群发推送、绑定微信/手机号/邮箱接收订单提醒、多门店展示、优惠券、卡券、余额充值/扣除、积分充值/扣除、会员等级/会员折扣设置、快速购买、模版消息通知、区域允许购买、视频文章展示、在线客服、一键导航、一键拨号、员工管理、详细的数据统计等等一系列商城https://www.kancloud.cn/lj419412084/qhv4/1757499
19.医院网站管理制度(精选6篇)(2)网站导航。①提供网站地图(纯文字索引)供查询,并提供帮助信息;②在各页面固定位置设置风格统一的导航栏,清晰表达本网页的逻辑位置;③各层级间的网页相互导航便捷;④导航文字准确、直观、易识别;⑤外部导航链接地址正确。 3、网站表现设计 网站表现形式应生动、形象并有自身特色,尽量从易用性和人性化的角度出发设https://www.ruiwen.com/word/yiyuanwangzhanguanlizhidu.html
20.神马广告与其他平台的差距新闻中心就像看商店的经营状况如何,既要看这家商店的地段热不热闹(神马搜索推广给客户带来了多少客人),还要看营业额好不好(这些客人中有多少完成了转化)。 23 5、神马推广后台(掌握)知识点『概念』神马推广后台(e.sm.cn):是基于 神马搜索、神马展示网络、神马导航等产品的推广营销平台。客户可以结合自身业务需求,进行 https://www.tui86.com/889.html
21.移动端app里面主要的三大控件布局为状态栏导航栏标签栏。刷刷题APP(shuashuati.com)是专业的大学生刷题搜题拍题答疑工具,刷刷题提供移动端app里面主要的三大控件布局为状态栏、导航栏、标签栏。A.正确B.错误的答案解析,刷刷题为用户提供专业的考试题库练习。一分钟将考试题Word文档/Excel文档/PDF文档转化为在线题库,制作自己的https://www.shuashuati.com/ti/f018667c5c474aa0a8b7f0829b726540.html?fm=bdce0487b1740e02b03a6334078ecbeb50
22.在单页设计中突出显示导航栏中的当前部分在单页设计中,突出显示导航栏中的当前部分是为了让用户清晰地知道他们当前所处的页面位置,提供更好的导航体验。这可以通过以下几种方式来实现: 1. 高亮当前部分:可以使用不同的颜色、加粗、下划线等方式来https://cloud.tencent.com/developer/information/%E5%9C%A8%E5%8D%95%E9%A1%B5%E8%AE%BE%E8%AE%A1%E4%B8%AD%E7%AA%81%E5%87%BA%E6%98%BE%E7%A4%BA%E5%AF%BC%E8%88%AA%E6%A0%8F%E4%B8%AD%E7%9A%84%E5%BD%93%E5%89%8D%E9%83%A8%E5%88%86