一、angular
1、总目录
2、代码
userlogin.comment.html
<br><h2>Pagge聊天室</h2>
<div class="loginwindow">
<h3>登录</h3>
<ul>
<li>账户:
<input type="text" placeholder="邮箱/用户名/电话" [(ngModel)]="userinfo" value="userinfo">
</li>
<li>密码:
<input type="password" [(ngModel)]="userpassword" [(ngModel)]="userpassword" value="userpassword">
</li>
<li>
验证码:<input type="text" [(ngModel)]="idcodenumber">
<a (click)="changeimg()">
<img [src]="image">
</a>
</li>
<li class="autologin">
<label>是否记住:</label>
<select id="remember" [(ngModel)]="choose">
<option value="0">不记住</option>
<option value="1">记住</option>
</select><br/>
</li>
</ul>
<br>
<button >
<a [routerLink]="['/register']" >__注册__</a>
</button>
<button (click)="userlogin()">
<!-- <a [routerLink]="link" ></a>__登录__</a> -->
__登录__
</button>
<br>
</div>
userlogin.comment.scss
h2{
text-align:center;
}
.loginwindow{
width: 400px;
height: 300px;
//margin: 100px 800px 15px; //上左右下
margin: 70px auto;
padding: 20px;
border: 1px solid rgb(0, 102, 218);
li{
height: 32px;
line-height: 50px;
}
button{
width: 100px;
height: 30px;
float:right;
margin-right: 50px;
margin-top: 25px;
}
img{
// max-width:100px;
width: 70px;
height: 50px;
margin: -1px 2px 0px 9px;
}
}
.autologin{
margin-top: 20px;
}
userlogin.comment.ts
import { Component, OnInit } from '@angular/core';
import { CommonService } from '../../services/common.service';
import {Router} from '@angular/router';
import { CookieService } from 'ngx-cookie-service';
@Component({
selector: 'app-userlogin',
templateUrl: './userlogin.component.html',
styleUrls: ['./userlogin.component.scss']
})
export class UserloginComponent implements OnInit {
constructor(
public cookieService: CookieService,
public common:CommonService,
private router:Router
) { }
ngOnInit() {
this.changeimg()
this.getusercookie()
}
//获取验证码
public image:string="";
public idcodenumberlist:any=["7364","vw07"];
public idcodenumber:any="";
public i:any=0;
changeimg(){
this.i=Math.floor(Math.random()*2);
this.image="assets/images/"+this.idcodenumberlist[this.i]+".jpg"
}
//判断登录
public userinfo :any="";
public userpassword :any="";
// public link:any="#"
userlogin(){
if ( this.idcodenumber!=this.idcodenumberlist[this.i] ){
alert("验证码错误")
this.changeimg()
return
}
this.common.login(this.userinfo, this.userpassword).then((Response:any)=>{
console.log(Response);
if(Response.status==0){
// this.link="['/friends?id="+Response.id+"']"
if(this.choose==1){
this.setusercookie(Response.id);
}
this.router.navigate(['/friends',Response.id]);
}else{
alert(Response.msg)
}
})
return
}
public choose:any=0
setusercookie(id){
console.log("设置cookie")
var time: number = 24*60*60*1000;// cookie过期时间24个小时 24*60*60*1000
this.cookieService.set("userid", id, new Date(new Date().getTime() + time))
}
getusercookie(){
var id= this.cookieService.get("userid");
console.log("获取cookie id="+id)
if(id!=""){
console.log("调往cookie")
this.router.navigate(['/friends',id]);
}
}
}
app.module.ts
comment.service.ts
参考博文 《 ng8 go 图片&聊天》
3、运行效果
4、bug
本页面验证码功能为“障眼法”,尚未完善。
二、golang
1、总目录
(数据库为 postgresql)
2、代码
loginregister.go
package servewr
import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
// 使用相对路径引用dbtable
"../dbtable"
)
// LoginResp login接口的响应
type LoginResp struct {
Status int `json:"status"`
ID string `json:"id"` // 用户的id
}
// RegisterResp login接口的响应
type RegisterResp struct {
Status int `json:"status"`
ID string `json:"id"` // 用户的id
}
// Login 登录接口
func Login(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Access-Control-Allow-Origin", "*") //允许访问所有域
w.Header().Add("Access-Control-Allow-Headers", "Content-TypeAuthorization") //header的类型
w.Header().Set("content-type", "application/json")
// 如果请求类型不是POST, 不处理该请求
if r.Method != "POST" {
return
}
resp := &LoginResp{
Status: 0,
ID: "",
}
// 读取请求实体中的数据
body, err := ioutil.ReadAll(r.Body)
if err != nil {
log.Printf("read http request failed, err: %v", err)
sendErrToClient(err.Error(), w)
return
}
if body == nil || len(body) == 0 {
log.Println("http request body is null")
sendErrToClient("http request body is null", w)
return
}
defer r.Body.Close()
data := make(map[string]interface{})
// json反序列化请求的数据
if err = json.Unmarshal(body, &data); err != nil {
log.Printf("json unmarshal failed, err: %v", err)
sendErrToClient(err.Error(), w)
return
}
// 类型断言
useraccount, ok := data["useraccount"].(string)
if !ok {
log.Println("type assertion failed")
sendErrToClient("type assertion failed", w)
return
}
password, ok := data["password"].(string)
if !ok {
log.Println("type assertion failed")
sendErrToClient("type assertion failed", w)
return
}
if useraccount == "" || password == "" {
log.Println("the useraccount or password is empty string")
sendErrToClient("the useraccount or password is empty string", w)
return
}
fmt.Printf("登陆中 useraccount: %s, password: %s \n", useraccount, password)
// 根据useraccount和password获取用户的id
resp.ID, err = dbtable.GetUserIDByUseraccountAndPassword(useraccount, password)
if err != nil {
log.Printf("get userid by useraccount and password failed, err: %v", err)
sendErrToClient(err.Error(), w)
return
}
fmt.Printf("user id: %s\n", resp.ID)
// 返回成功状态码0
resp.Status = 0
// json序列化login接口的响应
respByte, err := json.Marshal(resp)
if err != nil {
log.Printf("json marshal failed, err: %v", err)
sendErrToClient(err.Error(), w)
return
}
// 响应数据
_, err = w.Write(respByte)
if err != nil {
log.Printf("write the response failed, err: %v", err)
sendErrToClient(err.Error(), w)
return
}
return
}
// Register 登录接口
func Register(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Access-Control-Allow-Origin", "*") //允许访问所有域
w.Header().Add("Access-Control-Allow-Headers", "Content-TypeAuthorization") //header的类型
w.Header().Set("content-type", "application/json")
// 如果请求类型不是POST, 不处理该请求
if r.Method != "POST" {
return
}
log.Println("接入register")
fmt.Println("接入register")
resp := &RegisterResp{
Status: 0,
ID: "",
}
// 读取请求实体中的数据
body, err := ioutil.ReadAll(r.Body)
if err != nil {
log.Printf("read http request failed, err: %v", err)
sendErrToClient(err.Error(), w)
return
}
if body == nil || len(body) == 0 {
log.Println("http request body is null")
sendErrToClient("http request body is null", w)
return
}
defer r.Body.Close()
data := make(map[string]interface{})
// json反序列化请求的数据
if err = json.Unmarshal(body, &data); err != nil {
log.Printf("json unmarshal failed, err: %v", err)
sendErrToClient(err.Error(), w)
return
}
// 类型断言
username, ok := data["username"].(string)
if !ok {
log.Println("type assertion failed")
sendErrToClient("type assertion failed", w)
return
}
userphone, ok := data["userphone"].(string)
if !ok {
log.Println("type assertion failed")
sendErrToClient("type assertion failed", w)
return
}
usermail, ok := data["usermail"].(string)
if !ok {
log.Println("type assertion failed")
sendErrToClient("type assertion failed", w)
return
}
password, ok := data["password"].(string)
if !ok {
log.Println("type assertion failed")
sendErrToClient("type assertion failed", w)
return
}
resp.ID, err =dbtable.StorageUserInfoToDB(username, userphone, usermail, password)
if err!=nil{
log.Println(err)
x := fmt.Sprintf("%s", err)
sendErrToClient(x, w)
return
}
// 返回成功状态码0
resp.Status = 0
// json序列化register接口的响应
respByte, err := json.Marshal(resp)
if err != nil {
log.Printf("json marshal failed, err: %v", err)
sendErrToClient(err.Error(), w)
return
}
// 响应数据
_, err = w.Write(respByte)
if err != nil {
log.Printf("write the response failed, err: %v", err)
sendErrToClient(err.Error(), w)
return
}
if username=="xiaohua"{
err = dbtable.CreateXiaohuaFriend()
if err != nil {
log.Println("create XiaohuaFriend failed:", err)
return
}
}else{
err = dbtable.ConetFriendXiaohua(username)
if err != nil {
log.Println("conet Xiaohua failed:", err)
return
}
}
return
}
initDB.go
handleDB.go
handleErr.go
main.go
参考博文 《 ng8 go 图片&聊天》
3,运行
go run main.go