GVKun编程网logo

【JFinal-weixin】手机端开发 echart 问题(echarts 手机端)

1

本文将介绍【JFinal-weixin】手机端开发echart问题的详细情况,特别是关于echarts手机端的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及

本文将介绍【JFinal-weixin】手机端开发 echart 问题的详细情况,特别是关于echarts 手机端的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于Angular 入门(三) 手机端开发、JFinal Weixin 1.1 发布,微信极速 SDK、JFinal Weixin 1.2 发布,微信极速 SDK、JFinal Weixin 1.3 发布,微信极速 SDK的知识。

本文目录一览:

【JFinal-weixin】手机端开发 echart 问题(echarts 手机端)

【JFinal-weixin】手机端开发 echart 问题(echarts 手机端)

在采用 jifinal 微信开发的过程中发现一个问题:

页面使用 echart 进行图表显示,当初次渲染该页面的时候无图表,必须刷新页面之后才会显示图表

有人遇到过这种问题吗?如何解决?

Angular 入门(三) 手机端开发

Angular 入门(三) 手机端开发

上篇总结:

  • 管道 pipe

               相当于vue中的过滤器. 使用时: {{值 | 管道名:参数:参数...}}

               angular默认官方提供了一些常用管道, 可以直接使用

               也提供了自定义的方式: ng g p 管道名

  • 指令 directive

               生成命令: ng g d 指令名, 用于操作元素的 DOM 属性

  • 生命周期

               初始化 ngOnInit -> 挂载时 init -> 更新时 checked -> 销毁 destroy

  • 组件间的参数传递

–            父子: 子中用 @input() 关键词声明属性即可

–            子父: 子中要声明事件, 向外传递数据 @Output(), 父通过事件方式 传递一个 自身方法 给子, 子触发传入的方法 向方法中传递数据

–            兄弟: 子1 -> 父 -> 子2 或 服务进行全局状态管理.

  • 服务: 同vue 的 Vuex

               生成服务命令: ng g s 服务名

               使用时, 要通过 依赖注入 机制来完成.

–            依赖注入: 在构造函数的参数 中声明类型, 组件在使用时 就必须传递对应的类型的值.

–            其中: 我们负责声明依赖即可; 注入操作由系统自动完成;

               语法糖用法: constructor(权限词 参数名: 服务类型)

  • 网络服务: 官方提供了很多强大的服务, 网络服务是其中一种

–            网络模块默认未加载, 必须到 app.module.ts 文件中加载才可以

 话不多说直入主题 ;接下来介绍手机端的开发

 Ionic_________________

 Vue 有 mintUI, 制作手机端的界面

Angular 有 ionic, 制作手机端的 UI库

脚手架的安装:

npm install -g @ionic/cli --force

生成项目包

ionic start ionicApp blank
//     生成   包名      类型((blank/sidemenu/tabs)
/**
*- blank: 基础包
*- tabs: 带有标签栏导航的包
*- sidemenu: 带有侧边栏导航的包
/

包的运行:

ionic s

vscode插件:

 

 

 主要容器:

  • ion-app: 根容器
  • ion-header: 头部导航栏容器
  • ion-content: 主体内容部分
  • ion-footer: 底部容器

 

 更多组件详细介绍请点这里

 button按钮组件

<!-- 按钮组件 -->
<!-- https://ionicframework.com/docs/api/button -->
<ion-app>
  <ion-header>
    <ion-toolbar>
      <ion-title>按钮</ion-title>
    </ion-toolbar>
  </ion-header>

  <ion-content>
    <!-- 组件的风格, 默认会自动适配所在操作系统 -->
    <ion-button>我是按钮</ion-button>

    <!-- mode: 指定风格 -->
    <ion-button mode="ios">ios</ion-button>
    <ion-button mode="md">android</ion-button>

    <!-- 官方自带很多主题  theme -->
    <br />
    <ion-button color="primary">primary</ion-button>
    <ion-button color="secondary">secondary</ion-button>
    <ion-button color="tertiary">tertiary</ion-button>
    <ion-button color="success">success</ion-button>
    <ion-button color="warning">warning</ion-button>
    <ion-button color="danger">danger</ion-button>
    <ion-button color="light">light</ion-button>
    <ion-button color="medium">medium</ion-button>
    <ion-button color="dark">dark</ion-button>

    <!-- 大小 -->
    <br />
    <ion-button size="small">small</ion-button>
    <ion-button size="default">default</ion-button>
    <ion-button size="large">large</ion-button>

    <!-- 填充方式 -->
    <br />
    <ion-button fill="outline">outline</ion-button>
    <ion-button fill="solid">solid</ion-button>
    <ion-button fill="clear">clear</ion-button>

    <!-- 扩展方式 -->
    <br />
    <ion-button expand="block">block</ion-button>
    <ion-button expand="full">full</ion-button>

    <!-- 不可用 -->
    <br />
    <ion-button disabled>不可用</ion-button>
  </ion-content>
</ion-app>
View Code

bdge徽章

<!-- 徽章组件 badge -->
<!-- https://ionicframework.com/docs/api/badge -->
<ion-app>
  <ion-header>
    <ion-toolbar>
      <ion-title>badge徽章</ion-title>
    </ion-toolbar>
  </ion-header>

  <ion-content>
    <ion-badge>42</ion-badge>
    <ion-badge color="success">success</ion-badge>
    <ion-badge mode="ios" color="danger">ios</ion-badge>
  </ion-content>
</ion-app>
View Code

icon图标

<!-- 图标库 -->
<!-- https://ionicons.com/ -->
<ion-app>
  <ion-header>
    <ion-toolbar>
      <ion-title>icon</ion-title>
    </ion-toolbar>
  </ion-header>

  <ion-content>
    <ion-icon name="add"></ion-icon>

    <ion-icon name="logo-alipay"color="secondary"></ion-icon>
    <!-- 可以搭配按钮使用 -->
    <ion-button>
      <ion-icon name="add"></ion-icon>
    </ion-button>
  </ion-content>
</ion-app>
View Code

card卡片组件

<!-- 卡片组件 -->
<!-- https://ionicframework.com/docs/api/card -->
<ion-app>
  <ion-header>
    <ion-toolbar>
      <ion-title>卡片</ion-title>
    </ion-toolbar>
  </ion-header>

  <ion-content>
    <!-- i-card-full -->
    <ion-card>
      <img src="http://101.96.128.94:9999/mfresh/news_imgs/01.jpg" alt="" />
      <ion-card-header>
        <ion-card-subtitle>此净化器功能优秀, 节能减排, 价格优美.</ion-card-subtitle>
        <ion-card-title>净美仕净化器</ion-card-title>
      </ion-card-header>
      <ion-card-content>
        打掉的的阿达的看了看.马卡龙文件但大家拿健康的宽带连接我已大奖等你
      </ion-card-content>
    </ion-card>
  </ion-content>
</ion-app>
View Code 横向滚动展示

<!-- 横向滚动展示 -->
<!-- https://ionicframework.com/docs/api/slides -->
<ion-app>
  <ion-header>
    <ion-toolbar>
      <ion-title>横向滚动展示</ion-title>
    </ion-toolbar>
  </ion-header>

  <ion-content>
    <!-- slides: 容器;   slide: 项目 -->

    <!-- pager: 页数指示 -->
    <!-- loop: 循环滚动 -->
    <!-- autoplay: 自动滚动 -->
    <!-- disableOnInteraction: 用户触摸之后 让自动滚动失效;  默认为true -->
    <ion-slides
      pager
      [options]="{ loop: true, autoplay: { disableOnInteraction: false } }"
    >
    <!-- 在ts文件先定义好图片路径的数组 -->
      <ion-slide *ngFor="let item of images">
        <img [src]="item" alt="" />
      </ion-slide>
    </ion-slides>
  </ion-content>
</ion-app>
View Code

 grid栅格

<!-- 栅格布局 -->
<!-- https://ionicframework.com/docs/api/grid -->

<ion-app>
  <ion-header>
    <ion-toolbar>
      <ion-title>栅格布局</ion-title>
    </ion-toolbar>
  </ion-header>
  <ion-content>
    <!-- i-grid -->
    <!-- 在scss中定义样式grid-lianxi -->
    <ion-grid fixed>
      <ion-row>
        <!-- 每行最多12列,  size代表列数 -->
        <ion-col size="6">6</ion-col>
        <ion-col size="6">6</ion-col>
      </ion-row>

      <ion-row>
        <!-- 超出会换行 -->
        <ion-col size="4">4</ion-col>
        <ion-col size="5">5</ion-col>
        <ion-col size="6">6</ion-col>
        <ion-col size="7">7</ion-col>
      </ion-row>

      <ion-row>
        <ion-col size="3">3</ion-col>
        <!-- 不写会自动填充剩余份数 -->
        <ion-col>不写份数</ion-col>
      </ion-row>
    </ion-grid>
  </ion-content>
</ion-app>
View Code

 综合这些组件的一个例子

html:

<!-- 新闻 -->
<ion-app>
  <ion-header>
    <ion-toolbar color="danger">
      <ion-title>网易新闻</ion-title>
    </ion-toolbar>
  </ion-header>

  <!-- scrollEvents: 允许监听滚动事件, 默认false -->
  <!-- ionScroll: 滚动事件 -->
  <ion-content
    *ngIf="news"
    #content
    [scrollEvents]="true"
    (ionScroll)="onScroll($event)"
  >
    <!-- 下拉刷新 -->
    <ion-refresher slot="fixed" (ionRefresh)="doRefresh($event)">
      <ion-refresher-content></ion-refresher-content>
    </ion-refresher>

    <ion-grid fixed>
      <ion-row>
        <ion-col size="6" *ngFor="let item of news.result">
          <ion-card>
            <img [src]="item.image" alt="" />
            <div>
              <div>{{ item.title }}</div>
              <div>{{ item.passtime }}</div>
            </div>
          </ion-card>
        </ion-col>
      </ion-row>
    </ion-grid>

    <!-- 加载更多 -->
    <!-- threshold: 触底阈值. 10% 代表剩余未显示区域的高度 是 显示区域高度 10% 时触发触底操作 -->
    <ion-infinite-scroll
      threshold="10%"
      position="bottom"
      (ionInfinite)="loadData($event)"
    >
      <ion-infinite-scroll-content
        loadingSpinner="dots"
        loadingText="加载中..."
      >
      </ion-infinite-scroll-content>
    </ion-infinite-scroll>

    <!-- 悬浮按钮: 可以悬浮在已有内容的上方 -->
    <!-- vertical: 竖向, 可选值 top/center/bottom 对应 上/中/下 -->
    <!-- horizontal: 横向, 可选值 start/center/end -->
    <ion-fab
      [hidden]="!showGoTop"
      vertical="bottom"
      horizontal="end"
      slot="fixed"
    >
      <ion-fab-button (click)="goTop()">
        <ion-icon name="arrow-up-outline"></ion-icon>
      </ion-fab-button>
    </ion-fab>
  </ion-content>
</ion-app>
View Code

scss:

.grid-lianxi {
  border: 1px solid red;

  ion-row {
    border: 2px solid orange;

    ion-col {
      border: 1px solid blue;
    }
  }
}

.news-grid {
  padding: 3px;

  img {
    width: 100%;
  }

  ion-col {
    padding: 3px;
  }

  ion-card {
    margin: 0;

    .content {
      padding: 4px;

      div:first-child {
        color: black;
        text-overflow: -o-ellipsis-lastline;
        overflow: hidden;
        text-overflow: ellipsis;
        display: -webkit-Box;
        -webkit-line-clamp: 2;
        line-clamp: 2;
        -webkit-Box-orient: vertical;
        font-size: 1.1em;
        margin-bottom: 3px;
      }
    }
  }
}
View Code

ts:

import { HttpClient } from ''@angular/common/http'';
import { Component, ViewChild } from ''@angular/core'';
import { IonContent } from ''@ionic/angular'';

@Component({
  selector: ''app-root'',
  templateUrl: ''app.component.html'',
  styleUrls: [''app.component.scss''],
})
export class AppComponent {
  // 掌控子元素, 绑定变量 content 到 ion-content 组件
  @ViewChild(''content'') content: IonContent;

  showGoTop = false; //是否要显示 回到顶部 按钮

  // 绑定到 ion-conent 的滚动监听事件, 当滚动时自动触发
  onScroll(event) {
    console.log(event);

    const y = event.detail.currentY; //当前竖向滚动的 y
    //如果 y > 1200 就显示回到头部按钮
    this.showGoTop = y > 1200;
  }

  goTop() {
    // scrollToTop(动画时长);  单位毫秒
    this.content.scrollToTop(250);
  }

  constructor(public http: HttpClient) {}

  getUrl(pno: number) {
    return ''https://api.apiopen.top/getWangYiNews?page='' + pno;
  }

  news: News;

  ngOnInit(): void {
    const url = this.getUrl(1);

    this.http.get(url).subscribe((res: News) => {
      console.log(res);

      this.news = res;
    });
  }

  page = 1;

  //下拉刷新
  doRefresh(event) {
    console.log(''下拉刷新触发!'');
    const url = this.getUrl(1);
    this.http.get(url).subscribe((res: News) => {
      console.log(res);

      this.news = res;
      this.page = 1; //重置为 第一页

      event.target.complete(); //结束下拉刷新动画的显示
    });
  }

  // 触底时触发
  loadData(event) {
    // console.log(event);

    const url = this.getUrl(this.page + 1);

    this.http.get(url).subscribe((res: News) => {
      console.log(res);
      // 合并新旧数据中的数组
      res.result = this.news.result.concat(res.result);

      this.news = res;

      this.page++; //成功后, 页数+1

      //通知组件此次加载操作已完成;   这样组件才会监听下一次
      event.target.complete();
    });
  }

  images = [
    ''http://101.96.128.94:9999/mfresh/images/banner_01.jpg'',
    ''http://101.96.128.94:9999/mfresh/images/banner_02.jpg'',
    ''http://101.96.128.94:9999/mfresh/images/banner_03.jpg'',
    ''http://101.96.128.94:9999/mfresh/images/banner_04.jpg'',
  ];
}

/////////////////////////////////////////
///////// 返回值结构声明
interface News {
  code: number;
  message: string;
  result: NewsResult[];
}

interface NewsResult {
  image: string;
  passtime: string;
  path: string;
  title: string;
}
View Code

 item组件

<!-- item组件 -->
<!-- https://ionicframework.com/docs/api/item -->
<ion-app>
  <ion-header>
    <ion-toolbar>
      <ion-title>item</ion-title>
    </ion-toolbar>
  </ion-header>

  <ion-content>
    <ion-item>
      <ion-label>Awesome Label</ion-label>
    </ion-item>

    <!-- button: 可以点击 -->
    <!-- detail: 右侧出现 箭头图标 -->
    <ion-item button detail>
      <ion-label>Click me</ion-label>
    </ion-item>

    <ion-item>
      <!-- slot: 插槽;   item具有左右两个插槽, start 和 end -->
      <ion-badge slot="end">42</ion-badge>
      <ion-label>Item Avatar</ion-label>
    </ion-item>

    <ion-item>
      <!-- avatar: 把内部图片变圆形 -->
      <ion-avatar slot="start">
        <img
          src="http://www.gx8899.com/uploads/allimg/2017112908/pc2e3vft403.jpg"
        />
      </ion-avatar>
      <ion-label>
        <h3>重庆天花板</h3>
        <p>今天的面试题超级简单, 妥妥的~</p>
      </ion-label>
      <ion-badge color="danger" slot="end">42</ion-badge>
    </ion-item>

    <ion-item>
      <ion-icon name="settings" slot="start"></ion-icon>
      <ion-label>设置</ion-label>
    </ion-item>

    <ion-item lines="none">
      <ion-label>没有分割线</ion-label>
    </ion-item>

    <ion-item lines="full">
      <ion-label>分割线充满</ion-label>
    </ion-item>

    <ion-item>
      <ion-label>用户名:</ion-label>
      <ion-input placeholder="账号/手机号/邮箱"></ion-input>
    </ion-item>

    <ion-item>
      <ion-label>密码:</ion-label>
      <ion-input placeholder="密码" type="password"></ion-input>
    </ion-item>

    <!-- 分组 -->
    <ion-item-group>
      <ion-item-divider>
        <ion-label>A</ion-label>
      </ion-item-divider>

      <ion-item>
        <ion-label>阿宝</ion-label>
      </ion-item>
      <ion-item>
        <ion-label>阿花</ion-label>
      </ion-item>

      <ion-item-divider>
        <ion-label>B</ion-label>
      </ion-item-divider>

      <ion-item>
        <ion-label>宝蓝</ion-label>
      </ion-item>
      <ion-item>
        <ion-label>boner</ion-label>
      </ion-item>
    </ion-item-group>

    <!-- i-item-sliding: 通过滑动 显示隐藏操作 -->
  </ion-content>
</ion-app>
View Code

 

 

 

 

 

 

 

 

 

 

 

 

 

总结

以上是小编为你收集整理的Angular 入门(三) 手机端开发全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

原文地址:https://www.cnblogs.com/CIBud/p/14718845.html

JFinal Weixin 1.1 发布,微信极速 SDK

JFinal Weixin 1.1 发布,微信极速 SDK

JFinal Weixin 1.1 主要添加了消息加密功能,以及对 access token 意外失效问题做出了处理。
 access token 通常会因为外部原因而意外失效:
 1:项目中 AccessTokenApi 在获取到 access token 之后,在微信公众平台利用在线调试工具再次获取了该公众号的 access token
 2:项目中 AccessTokenApi 在获取到 access token 之后,其它程序包括正在开发中的程序再次获取了该公众号的 access token

 3:微信服务器未知原因导致当前 access token 失效(测试证实概率较高)

   开启加密功能步骤如下:
1:在配置文件中添加
  encryptMessage=true
  encodingAesKey=yourEncodingAesKey
2:在 YourJFinalConfig.configConstant(Constants me) 中添加
  ApiConfig.setEncryptMessage(getPropertyToBoolean("encryptMessage", false));
  ApiConfig.setEncodingAesKey(getProperty("encodingAesKey"));

3:登录微信平台配置 EncodingAESKey 值,以及选择消息加解密方式为安全模式,如下图所示


4:出现java.security.InvalidKeyException:illegal Key Size异常是正常现象,按照微信官方给的方案来解决:http://mp.weixin.qq.com/wiki/index.php?title=%E5%BC%80%E5%8F%91%E8%80%85FAQ

具体用法参考 jfinal-weixin-1.9-demo,在此下载 http://www.jfinal.com

One More Thing,JFinal 官方微信又一大波美女来袭,扫描下方二维码可立即查看,我们只看美女 ^_^


JFinal Weixin 1.2 发布,微信极速 SDK

JFinal Weixin 1.2 发布,微信极速 SDK

JFinal Weixin 1.2 主要添加了对多公众号账户的支持,并对原有代码进行小幅重构,具体变化如下:

改进内容:

  1. 添加 ApiConfigKit,便于将 ApiConfig 对象与当前线程进行绑定,方便在各处通过 ApiConfigKit.getApiConfig() 进行获取

  2. 原有 ApiCofig 对象中的所有属性与方法去掉 static 关键字

  3. WeixinController 更名为 MsgController,WeixinInterceptor 更名为 MsgInterceptor

  4. 添加 ApiController、ApiInterceptor

  5. 所有对 ApiConfig 静态方法有依赖的地方改为:ApiConfigKit.getApiConfig() 获取对象后再获取属性值,以便支持多公众号账户

  6. demo重构:DemoController 更名为 WeixinMsgController,ApiController更名为WeixinApiController

  7. WeixinConfig 中的路由配置 "/weixin" 改为 "/msg"

升级步骤:

  1. 引入新版本 jar 包 jfinal-weixin-1.2-bin-with-src.jar

  2. 原来继承自 WeixinController 的类改为继承 MsgController

  3. 需要使用 ApiConfig 的自定义 controller 需要继承自 ApiController

  4. 去掉YourJFinalConfig 中原来对 ApiConfig 的配置,改而实现控制中的 getApiConfig() 方法

  5. 原来对 ApiConfig 静态方法的依赖改为通过 ApiConfigKit.getApiConfig() 获取对象后再获取相关属性

  6. 使用 ApiConfigKit.setDevMode(true) 输出消息交互时的xml与json

多公众号支持的建议方案:

  1. 创建数据库表 api_config(weixinId, token, appId, appSecret, encodingAesKey, messageEncrypt)

  2. 多公众号的微信服务器 url 格式设置为:http://域名/msg?weixinId=123,其中 weixinId 对应 api_config 数据库表中的 weixinId

  3. 在 MsgController 继承类中的 getApiConfig() 中动态获取并返回相应的 ApiConfig 对象

    public ApiConfig getApiConfig() { 
        Record r = Db.findFrist("select * from api_config where weixinId=? limit 1", 
            getPara("weixinId")); 
        return new ApiConfig(r.get("token"), r.get("appId"), 
            r.get("appSecret"), r.get("encodingAesKey"), 
            r.get("messageEncrypt")); 
    }

One More Thing,JFinal 官方微信又一大波美女来袭,扫描下方二维码可立即查看,我们只看美女 ^_^

JFinal Weixin 1.3 发布,微信极速 SDK

JFinal Weixin 1.3 发布,微信极速 SDK

JFinal Weixin 1.3 主要是将JFinal升级到了2.0版,并对原有代码进行小幅重构,其它添加的功能如下:

1:添加 CustomMsgApi 支持多客服消息
2:添加 QrcodeApi 支持带参数的二维码生成

该版本最大的变化是引入了团队开发,此版本的CustomMsgApi、QrcodeApi 由 @小强哥unas 所贡献(http://my.oschina.net/u/923337/blog/470119)。此后 jfinal weixin 项目将引入更多的开发者,共同打造一个极度完善的微信开发 SDK,造福所有jfinal weixin开发者。

有兴趣、有能力的开发者可以加入本项目,共同打造极速微信SDK!

JFinal Weixin 是基于 JFinal 的微信公众号极速 SDK,只需参考 Demo 代码即可进行极速开发。自 JFinal Weixin 1.2 版本开始已添加对多公众号支持

源码地址:http://git.oschina.net/jfinal/jfinal-weixin

今天关于【JFinal-weixin】手机端开发 echart 问题echarts 手机端的讲解已经结束,谢谢您的阅读,如果想了解更多关于Angular 入门(三) 手机端开发、JFinal Weixin 1.1 发布,微信极速 SDK、JFinal Weixin 1.2 发布,微信极速 SDK、JFinal Weixin 1.3 发布,微信极速 SDK的相关知识,请在本站搜索。

本文标签: