Angular4+NodeJs+MySQL 入门-05 接口调用
接口调用
今天讲一下,如果在前端页面上通过调用后台接口,返回来的数据。把前面的几章结合起来。
这里所有用的代码在 https://github.com/xiaotuni/angular-map-http2。
简单介绍一下 https://github.com/xiaotuni/angular-map-http2 这个项目吧
分前端用的是Angular4写的: 前端分两部分一部分是WebApp移动端,一部分是接口管理可以算是PC端;
后台管理接口部分用得是NodeJs写的:主要核心功能就是规则解析,所有每一个接口的规则信息都保存到sys_rule这张表的content里了,里面以是JSON格式存放的规则信息。前端要添加什么接口,PC端添加接口规则就可以了,然后前端就可以进行调用了。目前简单的增、删、改、查及条件判断基本上没有什么问题。接口管理界面大概就是这个样子,界面很丑,哈哈~
好了现在开始正式来调用了。以用户登录来讲吧,
首先是画一个登录界面
html ->login.html内容
<xtn-navbar [(Title)]="__Title"></xtn-navbar>
<div class="loginCss">
<div class="top"></div>
<div class="ctrl">
<div class="username">
<input type="text" placeholder="Enter username" required [(ngModel)]="UserInfo.username">
</div>
<div class="password">
<input type="password" placeholder="Enter password" required [(ngModel)]="UserInfo.password">
</div>
</div>
<div class="operator">
<div class="btn" (click)="submit()">
<div class="login">
login
</div>
</div>
<div class="btn">
<div class="forget" (click)="forgetPassword()">
forget
</div>
</div>
</div>
</div>
Css –>login.scss 内容
.loginCss {
padding: 10px;
.ctrl {
margin-top: 20vh;
position: relative;
.username {
position: relative;
display: flex;
input {
border: 1px solid #f5f5f5;
padding: 5px 10px;
border-radius: 5px;
flex: 1;
font-size: 1rem;
}
}
.password {
@extend .username;
margin-top: 2rem;
}
}
.operator {
display: flex;
padding: 2rem;
.btn {
margin: 5px;
flex: 1;
text-align: center;
padding: 5px 10px;
> div {
padding: 5px 10px;
border: 1px solid #999;
&:hover {
border: 1px solid blue;
}
}
}
}
}
最后就是typescript了–>login.ts内容
import { Component, OnInit, Output, Input } from '@angular/core';
import { Utility, ServiceHelper, routeAnimation, BaseComponent } from '../Core';
import * as CryptoJS from 'crypto-js';
@Component({
selector: 'xtn-manage-login',
templateUrl: './login.html',
styleUrls: ['./login.scss'],
animations: [routeAnimation], // 页面切换动画
providers: [ServiceHelper] // 注入一个service
})
export class Login extends BaseComponent implements OnInit {
public UserInfo: any;
/**
* Creates an instance of Login.
* @param {ServiceHelper} sHelper service用于接口调用等
* @memberof Login
*/
constructor(private sHelper: ServiceHelper) {
super();
this.UserInfo = { username: 'admin', password: 'admin@163.com' };
}
ngOnInit() {
}
/**
* 点击登录按钮
*
* @memberof Login
*/
submit() {
const data = Object.assign({}, this.UserInfo);
data.password = CryptoJS.MD5(data.password).toString();
this.sHelper.UserInfo.Login(data).then(() => {
const { Params } = Utility.$GetContent(Utility.$ConstItem.UrlPathInfo) || { Params: {} };
const { IsGoBack } = Params || { IsGoBack: 0 };
if (!!Number(IsGoBack)) {
Utility.$GoBack();
} else {
Utility.$ToPage(Utility.$ConstItem.UrlItem.ManagerDashboard, {});
}
}, () => { });
}
forgetPassword() {
console.log('forgetPassword');
}
}
- Utility–>常用的一些方法都在这里,
- ServiceHelper–>所有Service都在这里可以找到,
- routeAnimation,–>WebApp在路由切换页面过滤效果
- BaseComponent –> 主要是实现路由切换的时候,要实现一个钩子动作,所以添加了这个,其它页面只要继承它就可以了,就不用每个界面都去实现钩子动作了。
ServiceHelper 里的代码
这个里面的代码其实很简单的,就是一个入口,有的时候一个组件要引用好多service,在构造函数里要好多 constructor(private service1: Service1,…) {}。我就把这些都放到一个里去。里面的代码如:
import { Injectable } from '@angular/core';
import { Client } from './Core';
import { ApiManagerService } from './ApiManager';
import { UserInfoService } from './UserInfo';
@Injectable()
export class ServiceHelper {
public ApiManager: ApiManagerService;
public UserInfo: UserInfoService;
constructor() {
this.ApiManager = new ApiManagerService(Client);
this.UserInfo = new UserInfoService(Client);
}
}
由于是用户登录,所以用到了UserInfoService这个类。
UserInfoService.ts,用户登录,注册,用户详情等接口调用及数据处理类
import { Utility } from './Core';
export class UserInfoService {
public UserInfo: any;
public Users: any[];
constructor(private Client) {
}
/**
* 用户登录
*
* @param {*} obj
* @returns {Promise<any>}
* @memberof UserInfoService
*/
Login(obj: any): Promise<any> {
const __List = { actions: { list: [], loading: 'Load', fail: 'Fail', complete: 'Complete' } };
__List.actions.list.push({
StateName: 'StateName', Condition: obj,
promise: (client) => client.post(client.API.UserInfo.Login, { data: obj }),
});
const __self = this;
return this.Client(__List).then((result) => {
__self.UserInfo = result && result[0] ? result[0] : [];
// 将token保存下来。
Utility.$SetContent(Utility.$ConstItem.UserInfo, __self.UserInfo, true);
return result;
});
}
}
接口调用的地址在哪里呢?是: (client) => client.post(client.API.UserInfo.Login, { data: obj }),而这个又在哪里西的呢,在ApiClient.ts文件里。之前的篇幅说到了,怎么配置。点击登录时,错误密码时出错。
后台接口配置下一篇再说了,只需要添加一条规则文件记录就可以了。
Angular4+NodeJs+MySQL 入门-05 接口调用的更多相关文章
- Angular4+NodeJs+MySQL 入门-04 接口调用类
上一篇文章说一下,后台接口的创建,这篇说一下如果调用接口. 创建一个目录helpers 此目录下有三个文件分别是 ApiClient.ts.clientMiddleware.ts.Core.ts,前面 ...
- Angular4+NodeJs+MySQL 入门-06 接口配置
在上篇中说了怎么调用接口,这篇就来说说,接口配置吧. 后端是用NodeJS来写的,由于写后台(以前用的是C#语言)的时候,大部操作都在是对数据库表的增.删.改.查操作, 比如:根据查询出来的数据,然后 ...
- Angular4+NodeJs+MySQL 入门-03 后台接口定义
这篇里是如何定义接口,我们一般访问接口如:post请求调用http://127.0.0.1:11000/webapi/userinfo/user 这个接口,成功返回用户信息,如果失败要返回失败原因等. ...
- Angular4+NodeJs+MySQL 入门-01
有一定的后台开发经验ES6语法.后台没有用框架来,纯自己写.会sql语句 安装NodeJS的安装 从网上下载 https://nodejs.org/en/ 选择自己,我用的是最新版本 Angular ...
- Angular4+NodeJs+MySQL 入门-02 MySql操作类
NodeJs操作MySQL类 此类封装了几个常用的方法:插入,更新,删除,查询,开启事务,事务提交,事务回滚等操作.有一这个类,操作MYSQL就方便多了. 批处理,存储过程等方法还没有添加,因为觉得目 ...
- nodejs+mysql入门实例
此前我已准备好mysql,使用的是PHP的组合包Appserv 手动添加数据库依赖: 在package.json的dependencies中新增, “mysql” : “latest”, { &quo ...
- nodejs+mysql入门实例(删)
//连接数据库 var mysql = require('mysql'); var connection = mysql.createConnection({ host: 'bdm253137448. ...
- nodejs+mysql入门实例(改)
//连接数据库 var mysql = require('mysql'); var connection = mysql.createConnection({ host: 'bdm253137448. ...
- nodejs+mysql入门实例(表的查询)
//连接数据库 var mysql = require('mysql'); var connection = mysql.createConnection({ host: '******', //数据 ...
随机推荐
- 请教一个Jquery ligerui 框架的小问题
关闭子窗体时,要刷新父窗体,百度了很多像使用“window.opener.location.reload();”都不行,和easyui框架是有区别的 在子窗体里写Response.Write(&quo ...
- 状态压缩DP----HDU4049 Tourism Planning
状态压缩动态规划感觉都不是那么好写,看网上的人说这题是2011年ACM/ICPC中的水题,暗地里感觉很是惭愧啊(花了将近4个小时),结果还算是勉勉强强地弄出来了. 与往常一样,先说说题目的意思和思路, ...
- Javascript脚本 :Function 对象的定义和使用
javascript Function 对象的定义 创建函数的语法:var myFunction=new Function(arg1,arg2,...agrN,body);agrN 为函数的参数,b ...
- Android Canvas的save(),saveLayer()和restore()浅谈
save() saveLayer() restore() 1.在自定义控件当中你onMeasure和onLayout的工作做完成以后就该绘制该控件了,有时候需要自己在控件上添加一些修饰来满足需求 ...
- 关于对SwfUpload的改造
Swfupload 在普通上传下,对于IE chrome firefox等有很好的兼容性. 但一旦与其他控件组合,很容易出现无法上传,帮顶事件丢失的情况. 例如Layer与Swfupload,上传一个 ...
- IT学习资源
介绍个人微信公众平台:Web开发笔记 含有免费学习资源,个人学习笔记,技术文章分享 资源篇 1.webapp书城开发 链接: https://pan.baidu.com/s/1pMHGKrh 密码: ...
- 第十二篇 os模块
Python的os模块提供了系统相关,目录,文件操作,执行命令等操作. 1.文件和目录操作相关的方法: 方法 说明 os.mkdir 创建目录 os.rmdir 删除目录 os.rename 重命名 ...
- Codeforces Round #545 (Div. 2)D(KMP,最长公共前后缀,贪心)
#include<bits/stdc++.h>using namespace std;const int N=1000007;char s1[N],s2[N];int len1,len2; ...
- css清除浮动的8种方法以及优缺点
浮动会使当前标签产生上浮的效果,同时会影响到前后的标签.父级标签的位置及width height 属性.而且同样的代码,在各种浏览器中效果可能不同,这样让清除浮动更难了.清除浮动引起的问题有很多的方法 ...
- 关于windows上 web 和 ftp 站点的创建及使用
关于windows上 web 和 ftp 站点的创建及使用 引言 其实这是我网络基础课上的一次作业,觉得挺实用的,遂写成博客分享,也算是对这次作业的一次总结. 实验目的 通过此实验掌握WEB和FTP站 ...