Переглянути джерело

修改readme文件,删除多余的文件

main
yk 1 рік тому
джерело
коміт
3661507177
4 змінених файлів з 71 додано та 912 видалено
  1. +2
    -1
      .gitignore
  2. +69
    -0
      README.md
  3. +0
    -871
      templates/login-bak.html
  4. +0
    -40
      templates/register.html

+ 2
- 1
.gitignore Переглянути файл

@@ -1,2 +1,3 @@
.idea/ .idea/
logs/*
logs/*
!logs/

+ 69
- 0
README.md Переглянути файл

@@ -0,0 +1,69 @@
# 使用文档

## 项目介绍
此项目是为一部分客户忌讳人脸照片数据上云端而做的一个本地化人脸后端服务,使用go语言编写,基于gin框架,使用sqlite数据库。
可以部署在客户的服务器上,也可以部署在我们数字人的Ubuntu里。

## 项目依赖
依赖docker环境

## 项目结构

```
.
├── README.md
├── business
│   ├── staff.go
├── common
│   ├── config.go
│   ├── common.go
│   ├── cache.go
│   ├── log.go
├── logs
├── static
│   ├── faces
│   ├── img
│   ├── js
│   ├── jqery.min.js
│   ├── msg-box.js
│── style.css
├── mydatabase
│   ├── sql_base.go
│   ├── sql_staff.go
├── templates
│   ├── conf.html
│   ├── info.html
│   ├── login.html
│   ├── mgr.html
│   ├── reg.html
├── go.mod
├── go.sum
├── main.go
├── staff.db
├── Dockerfile
├── build_and_run.sh
└── config.json
```

## 安装

将整个项目拷贝到服务器后,运行一下命令

```
sudo chmod +x build_and_run.sh
sudo ./build_and_run.sh
```

## 运行

### 登录页面
访问``http://服务器ip或域名:48484/`` 进入登录页面,可以切换用手机号登录或用账户密码登录,手机号需要在缔智元saas平台上进行维护,如果没有账号,请先点击去注册。
如果想去审批已注册的账户,请用管理员账号密码进行登录,登录成功会进入管理审批页面。
### 注册页面
直接访问``http://服务器ip或域名:48484/reg`` 进入注册页面。
### 配置页面
直接访问``http://服务器ip或域名:48484/config`` 进入配置页面。已开放数字人设备号,ip以及租户名称的配置。还有是否同步选项,此选项要和租户进行系统对接,默认置为不同步即可。
### 管理审批页面
访问``http://服务器ip或域名:48484/mgr`` 进入管理审批页面。访问该路径需要先进行账户密码登录。

## 注意

+ 0
- 871
templates/login-bak.html Переглянути файл

@@ -1,871 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
body{
margin: 0;
}
li {
list-style-type: none;
}
@media screen and (orientation: portrait) {
.login {
width: 100vw;
height: 100vh;
background-image: url("/static/img/phoneBgc.jpg");
background-size: 100% 100%;
background-repeat: no-repeat;
}
.register {
background-image: url("/static/img/registerBgc.jpg") !important;
padding-top: 15vh;
}
.logo {
width: 15vw;
margin: 4vw 0 0 4vw;
}
.login_title {
width: 100vw;
font-size: 8vw;
text-align: center;
margin-top: 15vh;
}
.register_loginTitle {
width: 100vw;
font-size: 8vw;
text-align: center;
}
.input_box {
width: 100vw;
height: 25vw;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
margin-top: 5vh;
position: relative;
}
.register_inputBox {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
margin-top: 5vh;
position: relative;
}
.phone_input{
width: 50vw;
height: 11vw;
border-radius: 2vw;
background-color: transparent;
font-size: 3vw;
padding-left: 2vw;
border: 1px solid #000;
position: absolute;
top: 0vw;
}
.register_phoneInput {
width: 50vw;
height: 5vh;
border-radius: 2vw;
background-color: transparent;
font-size: 3vw;
padding-left: 2vw;
border: 1px solid #000;
margin-bottom: 2vh;
}
.code_input {
width: 50vw;
height: 11vw;
margin-top: 2vh;
border-radius: 2vw;
padding-left: 2vw;
font-size: 3vw;
background-color: transparent;
border: 1px solid #000;
position: absolute;
top: 10vw;
}
.register_codeInput {
width: 50vw;
height: 5vh;
border-radius: 2vw;
background-color: transparent;
font-size: 3vw;
padding-left: 2vw;
border: 1px solid #000;
}
.login_button {
width: 40vw;
height: 5vh;
background-color: rgb(101, 161, 255);
border-radius: 10vw;
display: flex;
justify-content: center;
align-items: center;
color:#fff;
font-size: 4vw;
margin: 2vh 0 0 30vw;
}
.register_loginButton {
width: 40vw;
height: 5vh;
background-color: rgb(101, 161, 255);
border-radius: 10vw;
display: flex;
justify-content: center;
align-items: center;
color:#fff;
font-size: 4vw;
margin: 2vh 0 0 30vw;
}
.send_code {
position: absolute;
font-size: 2.5vw;
top: 18.5vw;
right: 30vw;
border-left: 2px solid;
padding-left: 2vw;
}
.employee {
display: flex;
align-items: center;
}
.administrator {
display: flex;
align-items: center;
margin-left: 5vw;
}
.choose_employee {
width: 2vw;
height: 2vw;
border-radius: 50%;
border: 2px solid #000;
margin-right: 1vw;
}
.choose_administrator {
width: 2vw;
height: 2vw;
border-radius: 50%;
border: 2px solid #000;
margin-right: 1vw;
}
.login_style {
display: flex;
justify-content: center;
align-items: center;
font-size: 2.5vw;
margin-top: 2vh;
}
.hidden {
display: none;
}
.active {
display: flex;
}
.background {
background-color: #000;
}
.password-container {
position: relative;
}
.password_toggle {
position: absolute;
width: 5vw;
top: 18vw;
right: 26vw;
}
.approval_page {
width: 100vw;
height: 100vh;
background-image: url("/static/img/registerBgc.jpg");
background-size: 100% 100%;
overflow: auto;
}
.approval_box {
max-width: 100vw;
min-height: 100vh;
background-color:rgba(237,237,237,0.8);
}
.search_people {
width: 80vw;
height: 5vh;
border-radius: 1vw;
margin: 5vh 0 0 10vw;
border: 0 solid #fff;
font-size: 3vw;
text-align: center;
}
.every_info {
height: 7vh;
margin-top: 3vh;
display: flex;
align-items: center;
justify-content: space-around;
font-size: 3vw;
}
#scroll-to-top-btn {
display: none;
position: fixed;
right: 20px;
bottom: 20px;
width: 7vw;
height: 10vh;
color: #fff;
border: none;
border-radius: 5px;
font-size: 3vw;
cursor: pointer;
}
.people_img {
width: 6vh;
height: 6vh;
}
.pass_nopass {
display: flex;
}
.pass {
background-color: rgb(92, 186, 45);
width: 10vw;
height: 5vw;
border-radius: 1vw;
display: flex;
justify-content: center;
align-items: center;
}
.no_pass {
background-color: rgb(187, 44, 45);
width: 10vw;
height: 5vw;
border-radius: 1vw;
display: flex;
justify-content: center;
align-items: center;
margin-left: 2vw;
}
.goTop_img {
width: 6vw;
height: 6vw;
}
}
@media screen and (orientation: landscape) {
input:focus {
border: 0.1vw solid #000;
outline: none; /* 可选,用于去除默认的外边框样式 */
}
.login {
width: 100vw;
height: 100vh;
background-image: url("/static/img/phoneBgc_pc.jpg");
background-size: 100% 100%;
background-repeat: no-repeat;
position: relative;
}
.PC_img {
width: 52.6vw;
height: 64.44vh;
background-image: url("/static/img/loginBox.png");
background-size: 100% 100%;
background-repeat: no-repeat;
position: absolute;
top: 18.88vh;
left: 23.7vw;
}
.register {
background-image: url("/static/img/registerBgc_pc.jpg") !important;
}
.logo {
width: 15vh;
margin: 4vh 0 0 4vh;
}
.login_title {
/* width: 100vw; */
font-size: 4vh;
text-align: center;
position: absolute;
z-index: 10;
top: 28vh;
margin-left: 58vw;
/* margin-top: 15vh;*/
}
.register_loginTitle {
width: 100vw;
display: flex;
justify-content: center;
font-size: 4vh;
text-align: center;
position: absolute;
z-index: 10;
top: 10vh;
}
.uploadImg {
width: 15vw;
}
.input_box {
flex-direction: column;
justify-content: center;
align-items: center;
margin-top: 15vh;
position: relative;
}
.register_inputBox {
width: 100vw;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
position: relative;
padding-top: 42vh;
}
.phone_input{
width: 15vw;
height: 6.66vh;
border-radius: 2vh;
background-color: transparent;
font-size: 2vw;
padding-left: 2vh;
padding-right: 5vw;
border: 0.1vw solid #000;
margin-left: 25vw;
}
.register_phoneInput {
width: 37vh;
height: 6vh;
border-radius: 2vh;
background-color: transparent;
font-size: 3vh;
border: 0.1vw solid #000;
margin-bottom: 5vh;
padding-left:1vw ;
}
.register_codeInput {
width: 37vh;
height: 6vh;
border-radius: 2vh;
background-color: transparent;
font-size: 3vh;
border: 0.1vw solid #000;
padding-left: 1vw ;
}
.code_input {
width: 15vw;
height: 6.66vh;
margin-top: 2vw;
border-radius: 2vh;
padding-left: 2vh;
font-size: 1.5vw;
padding-right: 5vw;
background-color: transparent;
border: 0.1vw solid #000;
margin-left: 25vw;
}
.login_button {
width: 16vw;
height: 3vw;
background-color: rgb(101, 161, 255);
border-radius: 10vh;
display: flex;
justify-content: center;
align-items: center;
color: #fff;
font-size: 2vw;
/* margin: 2vh 0 0 30vh; */
position: absolute;
left: 55vw;
top: 65vh;
}
.register_loginButton {
width: 30vh;
height: 3vw;
background-color: rgb(101, 161, 255);
border-radius: 1vw;
display: flex;
justify-content: center;
align-items: center;
color: #fff;
font-size: 3vh;
position: absolute;
left: 42.5vw;
top: 65vh;
}
.send_code {
position: absolute;
font-size: 1.5vh;
top: 11.5vh;
right: 27.3vw;
border-left: 0.1vw solid;
padding-left: 1vh;
display: flex;
align-items: center;
height: 3vw;
}
.employee {
display: flex;
align-items: center;
}
.administrator {
display: flex;
align-items: center;
margin-left: 3vw;
}
.hand:hover{
cursor: pointer;
}
.choose_employee {
width: 2vh;
height: 2vh;
border-radius: 50%;
border: 0.1vw solid #000;
margin-right: 1vh;
}
.choose_administrator {
width: 2vh;
height: 2vh;
border-radius: 50%;
border: 0.1vw solid #000;
margin-right: 1vh;
}
.login_style {
display: flex;
justify-content: center;
align-items: center;
font-size: 1vw;
margin-top: 2vw;
position: absolute;
left: 54.8vw;
}
.hidden {
display: none;
}
.active {
display: flex;
}
.background {
background-color: #000;
}
.password-container {
position: relative;
}
.password_toggle {
width: 3vw;
position: absolute;
font-size: 1.5vh;
top: 11.5vh;
right: 28.5vw;
padding-left: 0.5vh;
}
.approval_page {
width: 100vw;
height: 100vh;
background-image: url("/static/img/registerBgc.jpg");
background-size: 100% 100%;
overflow: auto;
}
.approval_box {
max-width: 100vw;
min-height: 100vh;
background-color:rgba(237,237,237,0.8);
}
.search_people {
width: 60vw;
height: 6vh;
border-radius: 1vh;
margin: 5vh 0 0 20vw;
border: 0 solid #fff;
font-size: 3vh;
text-align: center;
}
.every_info {
height: 7vw;
margin-top: 3vw;
display: flex;
align-items: center;
justify-content: space-around;
font-size: 3vh;
}
#scroll-to-top-btn {
display: none;
position: fixed;
right: 20px;
bottom: 20px;
width: 7vh;
height: 10vw;
color: #fff;
border: none;
border-radius: 5px;
font-size: 3vh;
cursor: pointer;
}
.people_img {
width: 6vw;
height: 6vw;
}
.pass_nopass {
display: flex;
}
.pass {
background-color: rgb(92, 186, 45);
width: 10vh;
height: 5vh;
border-radius: 1vh;
display: flex;
justify-content: center;
align-items: center;
}
.no_pass {
background-color: rgb(187, 44, 45);
width: 10vh;
height: 5vh;
border-radius: 1vh;
display: flex;
justify-content: center;
align-items: center;
margin-left: 2vh;
}
.goTop_img {
width: 6vh;
height: 6vh;
}
}

.list_box{
padding-inline-start: 0px;
}

.uploadImg{
width: 48% !important;
transform: translate(0%, 0%) !important;
}

.upload-img-box {
position: relative;
}

.upload-img-box .input-box {
display: inline-block;
width: 144px;
height: 144px;
/*border: solid black 1px;*/
}

.upload-img-box .befor-img {
display: flex;
/*width: 300px;*/
/*height: 90px;*/
/*border: solid black 1px;*/
position: absolute;
top: 0px;
left: 0px;
/*background: #ffffff;*/
z-index: 30;
align-items: center;
justify-content: center;
}

.upload-img-box .befor-img.hasImg {
display: none;
}

.upload-img-box .after-img {
display: inline-block;
width: 144px;
height: 144px;
border: none;
/*position: absolute;*/
top: 0px;
left: 0px;
/*background: #ffffff;*/
z-index: 20;
}

.after-img img, .uploadImg {
/*position: absolute;*/
width: 100%;
height: 100%;
object-fit: cover; /*根据父容器的尺寸裁剪和缩放图片,以填充整个容器,并保持长宽比例不变。*/
object-position: center; /*指定对象的位置,如果不设置,则默认是center*/
background-size: cover; /*背景图片的大小,如果不设置,则默认是auto*/
background-position: center;
top: 50%;
left: 50%;
transform: translate(-50%, 0%);/*将元素移动到中心*/
border-radius: 50%;
}
</style>
</head>
<body>
<!-- 登录页面 -->
<div class="login">
<img class="logo" src="/static/img/logo.png" alt="">
<div class="PC_img"></div>
<div class="login_title">请 登 录</div>
<div id="employeeForm" class="input_box hidden active">
<input class="phone_input" type="text" placeholder="请输入手机号">
<input class="code_input" type="text" placeholder="请输入验证码">
<div class="send_code hand">发送验证码</div>
</div>
<div id="adminForm" class="input_box hidden password-container">
<input class="phone_input" type="text" placeholder="请输入账号">
<input id="password-input" class="code_input" type="password" placeholder="请输入密码">
<img id="password_toggle" class="password_toggle hand" src="/static/img/close.png" alt="">
</div>
<div class="login_style">
<div id="employeeBtn" class="employee hand">
<div id="choose_employee" class="choose_employee background"></div>
<div>员工登录</div>
</div>
<div id="adminBtn" class="administrator hand">
<div id="choose_administrator" class="choose_administrator"></div>
<div>管理员登录</div>
</div>
</div>
<div class="login_button hand">登 录</div>
</div>
<!-- 注册页面 -->
<div style="display: none;" class="register login">
<div class="register_loginTitle ">
<div class="upload-img-box">
<div class="input-box">
<input type="file" id="img-file" hidden="hidden" name="选择图片">
</div>
<div class="befor-img">
<img class="uploadImg hand" src="/static/img/upload.png" alt="">
</div>
<div class="after-img">
<img id="img-box" src="" width="30%" height="auto">
</div>
</div>

</div>
<div class="register_inputBox">
<input class="register_phoneInput" type="text" placeholder="员工编号">
<input class="register_codeInput" type="text" placeholder="员工姓名">
</div>
<div class="register_loginButton hand">注册人脸</div>
</div>
<!-- 管理员页面 -->
<div style="display: none;" class="approval_page">
<div id="scroll_box" class="approval_box">
<input id="search" class="search_people" type="text" placeholder="🔍 搜索">
<ul class="list_box">
<li class="every_info">
<img class="people_img" src="/static/img/logo.png" alt="">
<div class="name">张三</div>
<div class="people_code">001</div>
<div class="pass_nopass">
<div class="pass">通过</div>
<div class="no_pass">不通过</div>
</div>
</li>
<li class="every_info"> <img class="people_img" src="/static/img/logo.png" alt="">
<div class="name">张三</div>
<div class="people_code">001</div>
<div class="pass_nopass">
<div class="pass">通过</div>
<div class="no_pass">不通过</div>
</div></li>
<li class="every_info"> <img class="people_img" src="/static/img/logo.png" alt="">
<div class="name">张三</div>
<div class="people_code">001</div>
<div class="pass_nopass">
<div class="pass">通过</div>
<div class="no_pass">不通过</div>
</div></li>
<li class="every_info"> <img class="people_img" src="/static/img/logo.png" alt="">
<div class="name">张三</div>
<div class="people_code">001</div>
<div class="pass_nopass">
<div class="pass">通过</div>
<div class="no_pass">不通过</div>
</div></li>
<li class="every_info"> <img class="people_img" src="/static/img/logo.png" alt="">
<div class="name">张三</div>
<div class="people_code">001</div>
<div class="pass_nopass">
<div class="pass">通过</div>
<div class="no_pass">不通过</div>
</div></li>
<li class="every_info"> <img class="people_img" src="/static/img/logo.png" alt="">
<div class="name">张三</div>
<div class="people_code">001</div>
<div class="pass_nopass">
<div class="pass">通过</div>
<div class="no_pass">不通过</div>
</div></li>
<li class="every_info"> <img class="people_img" src="/static/img/logo.png" alt="">
<div class="name">张三</div>
<div class="people_code">001</div>
<div class="pass_nopass">
<div class="pass">通过</div>
<div class="no_pass">不通过</div>
</div></li>
<li class="every_info"> <img class="people_img" src="/static/img/logo.png" alt="">
<div class="name">张三</div>
<div class="people_code">001</div>
<div class="pass_nopass">
<div class="pass">通过</div>
<div class="no_pass">不通过</div>
</div></li>
<li class="every_info"> <img class="people_img" src="/static/img/logo.png" alt="">
<div class="name">张三</div>
<div class="people_code">001</div>
<div class="pass_nopass">
<div class="pass">通过</div>
<div class="no_pass">不通过</div>
</div></li>
<li class="every_info"> <img class="people_img" src="/static/img/logo.png" alt="">
<div class="name">张三</div>
<div class="people_code">001</div>
<div class="pass_nopass">
<div class="pass">通过</div>
<div class="no_pass">不通过</div>
</div></li>
<li class="every_info"> <img class="people_img" src="/static/img/logo.png" alt="">
<div class="name">张三</div>
<div class="people_code">001</div>
<div class="pass_nopass">
<div class="pass">通过</div>
<div class="no_pass">不通过</div>
</div></li>
<li class="every_info"> <img class="people_img" src="/static/img/logo.png" alt="">
<div class="name">张三</div>
<div class="people_code">001</div>
<div class="pass_nopass">
<div class="pass">通过</div>
<div class="no_pass">不通过</div>
</div></li>
<li class="every_info"> <img class="people_img" src="/static/img/logo.png" alt="">
<div class="name">张三</div>
<div class="people_code">001</div>
<div class="pass_nopass">
<div class="pass">通过</div>
<div class="no_pass">不通过</div>
</div></li>
<li class="every_info"> <img class="people_img" src="/static/img/logo.png" alt="">
<div class="name">张三</div>
<div class="people_code">001</div>
<div class="pass_nopass">
<div class="pass">通过</div>
<div class="no_pass">不通过</div>
</div></li>
<li class="every_info"> <img class="people_img" src="/static/img/logo.png" alt="">
<div class="name">张三</div>
<div class="people_code">001</div>
<div class="pass_nopass">
<div class="pass">通过</div>
<div class="no_pass">不通过</div>
</div></li>
<li class="every_info"> <img class="people_img" src="/static/img/logo.png" alt="">
<div class="name">张三</div>
<div class="people_code">001</div>
<div class="pass_nopass">
<div class="pass">通过</div>
<div class="no_pass">不通过</div>
</div></li>
</ul>
</div>
<a id="scroll-to-top-btn" href="">
<img class="goTop_img" src="/static/img/goTop.png" alt="">
</a>
</div>
<script src="/static/js/jquery.min.js"></script>
<script>
$(function(){
$(".login_button").on("click",function(){
console.log("click");
$(".login").css("display","none");
// $(".approval_page").css("display","block");
$(".register").css("display","block");
})


$(document).on("click", ".upload-img-box .befor-img,.upload-img-box .after-img", function (e) {
$(".input-box input").trigger("click");
})
// 使用input 的change事件,监听当文件上传的值进行改变的时候,才触发事件。
$(document).on("change", ".upload-img-box #img-file", function () {
var file = $("#img-file")[0].files[0];
console.log(file);
// file 内容包括: lastModified , lastModifiedDate , name , size , type
var formdata = new FormData();
formdata.append('file', file);

if (window.FileReader) {
var fr = new FileReader();
fr.onloadend = function (e) {
// console.log(this.result);
// document.getElementById("portrait").src = e.target.result;
$("#img-box").attr("src",e.target.result)
$(".upload-img-box .befor-img").addClass("hasImg")
};
//给FileReader对象一个读取完成的方法,
//使用readAsDataURL会返回一个url
//这个值就保存在事件对象的result里
//img通过加载这个地址,完成图片的加载
fr.readAsDataURL(file);
}

//判断图片大小
if (file.size > 3 * 1024 * 1024) {
alert("上传图片不能大于3M");
}

//判断图片数据类型
if (!/.(gif|jpg|jpeg|png|GIF|JPG|bmp)$/.test(file.name)) {

alert("图片类型必须是.gif,jpeg,jpg,png,bmp中的一种");
}
})
})
// 切换登陆页面
document.getElementById("employeeBtn").addEventListener("click", function() {
document.getElementById("employeeForm").classList.add("active");
document.getElementById("adminForm").classList.remove("active");
document.getElementById("choose_administrator").classList.remove("background");
document.getElementById("choose_employee").classList.add("background");
});
document.getElementById("adminBtn").addEventListener("click", function() {
document.getElementById("employeeForm").classList.remove("active");
document.getElementById("adminForm").classList.add("active");
document.getElementById("choose_employee").classList.remove("background");
document.getElementById("choose_administrator").classList.add("background");
});
document.getElementById("password_toggle").addEventListener("click", function() {
let passwordInput = document.getElementById("password-input")
if (passwordInput.type === 'password') {
passwordInput.type ='text';
document.getElementById("password_toggle").src = "/static/img/open.png"
} else {
passwordInput.type = "password";
document.getElementById("password_toggle").src = "/static/img/close.png"
}
});
// 点击回到顶部
var element = document.getElementById('search');

var observer = new IntersectionObserver(function(entries) {
entries.forEach(function(entry) {
var scrollToTopBtn = document.getElementById('scroll-to-top-btn');
if (entry.isIntersecting) {
// 元素进入视口,执行代码
scrollToTopBtn.style.display = 'none';
} else {
scrollToTopBtn.style.display = 'block';
}
});
});

observer.observe(element);

document.getElementById('scroll-to-top-btn').addEventListener('click', function() {
document.getElementById("scroll_box").scrollTop = 0
});



</script>
</body>
</html>

+ 0
- 40
templates/register.html Переглянути файл

@@ -1,40 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Register</title>
<link rel="stylesheet" href="/static/styles.css">
</head>
<body>
<h1>Register</h1>
{{if .Message}}
<p>{{.Message}}</p>
{{end}}
<form action="/register" method="post">
<label for="username">姓名:</label>
<input type="text" id="username" name="username" required><br>
{{ range $i, $v := .users }}
<label >{{ $v.Name }}</label>
{{ end }}
<label for="phone">电话:</label>
<input type="phone" id="phone" name="phone" required><br>

<label for="level">员工类型:</label>
<select>
<option value="10">员工</option>
<option value="71">领导</option>
</select><br>

<label for="level">性别:</label>
<select>
<option value="1">男</option>
<option value="2">女</option>
</select><br>

<input type="submit" value="Register">
</form>
<a href="/">Home</a>
</body>
</html>

Завантаження…
Відмінити
Зберегти