Javascript 如何更改html登录页?
我实际上刚刚开始使用HTML,我正在做一个在线支付系统。我正在尝试修复web应用程序的UI,但我无法做到这一点。我想问一下,如何将图1中的登录页面转换为第二张图? 第一张照片 第二张照片 我还想附上我一直在做的代码,如果你能做到的话,我真的很感谢你的帮助。 所选UI登录页面的链接: 代码.gsJavascript 如何更改html登录页?,javascript,html,css,user-interface,google-apps-script,Javascript,Html,Css,User Interface,Google Apps Script,我实际上刚刚开始使用HTML,我正在做一个在线支付系统。我正在尝试修复web应用程序的UI,但我无法做到这一点。我想问一下,如何将图1中的登录页面转换为第二张图? 第一张照片 第二张照片 我还想附上我一直在做的代码,如果你能做到的话,我真的很感谢你的帮助。 所选UI登录页面的链接: 代码.gs var url = "https://docs.google.com/spreadsheets/d/1bM8l6JefFsPrlJnTWf56wOhnuSjdIwg3hMbY1tN1Zp8/e
var url = "https://docs.google.com/spreadsheets/d/1bM8l6JefFsPrlJnTWf56wOhnuSjdIwg3hMbY1tN1Zp8/edit#gid=1775459006";
var streetSheetName = "JALAN SANGGUL 4";
function doGet(e) {
var streetSheetName = "JALAN SANGGUL 4"; // Added
PropertiesService.getScriptProperties().setProperty("streetSheetName", streetSheetName); // Added
return HtmlService.createHtmlOutputFromFile('WebAppLogin')
.setTitle("Resident Payment");
}
function checkLogin(username, password) {
var found_record = '';
var name = '';
var ss = SpreadsheetApp.openByUrl(url);
var webAppSheet = ss.getSheetByName("USERNAMES");
var getLastRow = webAppSheet.getLastRow();
for(var i = 2; i <= getLastRow; i++) {
if(webAppSheet.getRange(i, 1).getValue().toUpperCase() == username.toUpperCase() && webAppSheet.getRange(i, 7).getValue() == password) {
found_record = 'TRUE';
name = webAppSheet.getRange(i, 4).getValue().toUpperCase() + " " + webAppSheet.getRange(i, 5).getValue().toUpperCase();
streetSheetName = webAppSheet.getRange(i, 3).getValue().toUpperCase();
} else if (username.toUpperCase() == 'ADMIN' && password == 'ADMINPASSWORD') {
found_record = 'TRUE';
name = webAppSheet.getRange(i, 4).getValue().toUpperCase() + " " + webAppSheet.getRange(i, 5).getValue().toUpperCase();
streetSheetName = webAppSheet.getRange(i, 3).getValue().toUpperCase();
}
}
PropertiesService.getScriptProperties().setProperty("streetSheetName", streetSheetName); // Added
if(found_record == '') {
found_record = 'FALSE';
}
return [found_record, username,name];
}
function GetRecords(username,filter) {
var filteredDataRangeValues = GetUsernameAssociatedProperties(username);
var resultArray = GetPaymentRecords(filteredDataRangeValues,filter);
var resultFilter = getYears();
result = {
data: resultArray,
filter: resultFilter
};
return result;
}
function getYears() {
var ss= SpreadsheetApp.openByUrl(url);
var yearSheet = ss.getSheetByName("Configuration");
var getLastRow = yearSheet.getLastRow();
var return_array = [];
for(var i = 2; i <= getLastRow; i++)
{
if(return_array.indexOf(yearSheet.getRange(i, 2).getDisplayValue()) === -1) {
return_array.push(yearSheet.getRange(i, 2).getDisplayValue());
}
}
return return_array;
}
function changePassword(username, newPassword) {
var sheet = SpreadsheetApp.openByUrl(url).getSheetByName("USERNAMES");
var range = sheet.getRange("A2:A").createTextFinder(username).matchEntireCell(true).findNext();
if (range) {
range.offset(0, 6).setValue(newPassword);
}
}
function GetUsernameAssociatedProperties(username) {
var filteredDataRangeValues = '';
var ss = SpreadsheetApp.openByUrl(url);
var displaySheet = ss.getSheetByName("USERNAMES");
var dataRangeValues = displaySheet.getDataRange().getValues();
if (username.toUpperCase() == 'ADMIN') {
dataRangeValues.shift();
filteredDataRangeValues = dataRangeValues;
} else {
filteredDataRangeValues = dataRangeValues.filter(row => row[0].toUpperCase() == username.toUpperCase());
}
return filteredDataRangeValues;
}
function GetPaymentRecords(userProperties,filter) {
var streetSheetName = PropertiesService.getScriptProperties().getProperty("streetSheetName"); // Added
var transpose = m => m[0].map((_, i) => m.map(x => x[i]));
var resultArray = [];
var ss = SpreadsheetApp.openByUrl(url);
var displaySheet = ss.getSheetByName(streetSheetName);
var addressValues = displaySheet.getRange("B:C").getValues();
var paidMonthValues = displaySheet.getRange(1, 7, displaySheet.getLastRow(), displaySheet.getLastColumn() - 6).getValues();
//Logger.log(addressValues);
//Logger.log(transpose(paidMonthValues));
userProperties.forEach((v, i) => {
var userHouseNumber = v[1];
var userStreet = v[2];
var column = addressValues.reduce(function callbackFn(accumulator, currentValue, index, array) {
if (currentValue[0] == userHouseNumber && currentValue[1] == userStreet) {
return index
} else {
return accumulator
}
}, '');
//Logger.log(column);
Logger.log(filter)
Logger.log(paidMonthValues);
if(filter=="None"){
var result = transpose(paidMonthValues).map(function callbackFn(element, index, array) {
return [element[0], userHouseNumber, userStreet, element[column] || '']
});
}else{
var result = transpose(paidMonthValues).map(function callbackFn(element, index, array) {
if(element[0].includes(filter))return [element[0], userHouseNumber, userStreet, element[column] || '']
});
}
resultArray = resultArray.concat(result);
//Logger.log(resultArray);
})
//Remove null elements
resultArray = resultArray.filter(element=>{
Logger.log(element!=null)
return element != null;
});
return resultArray;
}
function include(filename) {
return HtmlService.createHtmlOutputFromFile(filename)
.getContent();
}
var url=”https://docs.google.com/spreadsheets/d/1bM8l6JefFsPrlJnTWf56wOhnuSjdIwg3hMbY1tN1Zp8/edit#gid=1775459006";
var streetSheetName=“JALAN SANGGUL 4”;
函数doGet(e){
var streetSheetName=“JALAN SANGGUL 4”;//添加
PropertiesService.getScriptProperties().setProperty(“streetSheetName”,streetSheetName);//已添加
返回HtmlService.CreateHtmlOutFromFile('WebAppLogin')
.setTitle(“居民付款”);
}
功能检查登录(用户名、密码){
var发现_记录=“”;
变量名=“”;
var ss=SpreadsheetApp.openByUrl(url);
var webAppSheet=ss.getSheetByName(“用户名”);
var getLastRow=webAppSheet.getLastRow();
对于(var i=2;im[0]),map((q,i)=>m.map(x=>x[i]);
var resultArray=[];
var ss=SpreadsheetApp.openByUrl(url);
var displaySheet=ss.getSheetByName(streetSheetName);
var addressValues=displaySheet.getRange(“B:C”).getValues();
var paidMonthValues=displaySheet.getRange(1,7,displaySheet.getLastRow(),displaySheet.getLastColumn()-6).getValues();
//Logger.log(地址值);
//log(转置(paidMonthValue));
userProperties.forEach((v,i)=>{
var userHouseNumber=v[1];
var userStreet=v[2];
var列=addressValues.reduce(函数callbackFn(累加器、currentValue、索引、数组){
如果(currentValue[0]==userHouseNumber&¤tValue[1]==userStreet){
回报指数
}否则{
回流蓄能器
}
}, '');
//Logger.log(列);
Logger.log(过滤器)
Logger.log(paidMonthValue);
如果(过滤器=“无”){
var结果=转置(paidMonthValues).map(函数callbackFn(元素、索引、数组){
return[element[0],userHouseNumber,userStreet,element[column]| |'']
});
}否则{
var结果=转置(paidMonthValues).map(函数callbackFn(元素、索引、数组){
if(element[0]。includes(filter))返回[element[0],userHouseNumber,userStreet,element[column]| |']
});
}
resultaray=resultArray.concat(结果);
//Logger.log(resultArray);
})
//删除空元素
resultArray=resultArray.filter(元素=>{
Logger.log(元素!=null)
返回元素!=null;
});
返回结果数组;
}
函数包括(文件名){
返回HtmlService.createHtmlOutFromFile(文件名)
.getContent();
}
WebAppLogin
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css"
integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link href="https://fonts.googleapis.com/css?family=Asap" rel="stylesheet">
<?!= include('JavaScript'); ?>
<?!= include('CssLogin'); ?>
</head>
<body>
<div class="page">
<div class="container">
<div class="left">
<div class="login">Login</div>
<div class="eula">By logging in you agree to the ridiculously long terms that you didn't bother to read</div>
</div>
<div class="right">
<svg viewBox="0 0 320 300">
<defs>
<linearGradient
inkscape:collect="always"
id="linearGradient"
x1="13"
y1="193.49992"
x2="307"
y2="193.49992"
gradientUnits="userSpaceOnUse">
<stop
style="stop-color:#ff00ff;"
offset="0"
id="stop876" />
<stop
style="stop-color:#ff0000;"
offset="1"
id="stop878" />
</linearGradient>
</defs>
<path d="m 40,120.00016 239.99984,-3.2e-4 c 0,0 24.99263,0.79932 25.00016,35.00016 0.008,34.20084 -25.00016,35 -25.00016,35 h -239.99984 c 0,-0.0205 -25,4.01348 -25,38.5 0,34.48652 25,38.5 25,38.5 h 215 c 0,0 20,-0.99604 20,-25 0,-24.00396 -20,-25 -20,-25 h -190 c 0,0 -20,1.71033 -20,25 0,24.00396 20,25 20,25 h 168.57143" />
</svg>
<div class="form">
<label for="email">Email</label>
<input type="email" id="email">
<label for="password">Password</label>
<input type="password" id="password">
<input type="submit" id="submit" value="Submit">
</div>
</div>
</div>
</div>
<div class = "login">
<h2> Resident Payment Status Portal</h2>
</div>
<div id="loginDisplay" style="padding: 10px">
<div class="form-row">
<div class="form-group col-md-3" style="margin:0 auto">
<label>User Name</label>
<input type="text" id="username" class="form-control" required/>
</div>
</div>
<hr>
<div class="form-row">
<div class="form-group col-md-3" style="margin:0 auto">
<label>Password</label><br>
<input type="password" id="password" class="form-control" required/>
</div>
</div>
<hr>
<button class="btn btn-primary" type="button" id="LoginButton" onclick="GetRecords()" >
Login
</button>
<span id="errorMessage" style="color: red" ></span>
</div>
</div>
<hr>
<div style="display:none" id="dataDisplay">
<div>
<h2 id="firstLastName"></h2>
</div>
<input type="hidden" id="currentUser" value=""/>
<div style="width:1200px;margin:0 auto;">
<div id ="myFilter" class="form-group"></div>
<hr>
<div id="displayRecords" style="padding: 10px;" ></div>
<!----Paypal Button-------->
<hr>
<div style="width:500px;margin:0 auto;">
<div id="digitalgoods-030521182921-1" style="display: none;"></div>
<script>(function (div, currency) {var item_total = {currency_code: currency,value: '50.00',},tax_total = {currency_code: currency,value: '0.00' },render = function () {window.paypal.Buttons({createOrder: function (data, actions) {return actions.order.create({application_context: {brand_name: "",landing_page: "BILLING",shipping_preference: "NO_SHIPPING",payment_method: {payee_preferred: "UNRESTRICTED"}},purchase_units: [{description: "",soft_descriptor: "digitalgoods",amount: {breakdown: {item_total: item_total,tax_total: tax_total},value: '50.00' },items: [{name: "Monthly Fees",quantity: 1,description: "",sku: "1",unit_amount: item_total,tax: tax_total}]}]});},onApprove: function (data, actions) {return actions.order.capture().then(function (details) {div.innerHTML = "Order completed. You\x27ll receive an email shortly!";});},onCancel: function (data) {},onError: function (err) {div.innerHTML = "<pre>" + err.toString()}}).render("#digitalgoods-030521182921-1");},init = function () {window.digitalgoods = window.digitalgoods || [];window.digitalgoods.push(render);var file = "https://www.paypal.com/sdk/js?client-id=AS-86gVX_DfakSkq6YZDJRdKZb4SMIziOd5c9DIKy4extQrpb0VFEprDleB_duKI4BJQQRewUdfliZEf\x26currency=MYR";var script = document.createElement("script");script.type = "text/javascript";script.src = file;script.onload = function() {var i = window.digitalgoods.length;while (i--) {window.digitalgoods[i]();}};div.appendChild(script);};init();})(document.getElementById("digitalgoods-030521182921-1"), "MYR");</script>
</div>
<!-----Change Password----------->
<div>
<!--<button type="button" class="btn btn-primary btn-md" onclick="changePassword()">Change Password</button>-->
<!-- Button trigger modal -->
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModalCenter">
Change Password
</button>
<!-- Modal -->
<div class="modal fade" id="exampleModalCenter" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<div class="modal-header">
<h3 class="modal-title" id="exampleModalLongTitle">Change Password</h3>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<div class="form-group">
<label>Enter New Password</label><br>
<input type="password" id="newPassword" class="form-control" required/>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
<button type="button" class="btn btn-primary" onclick="changePassword()">Save changes</button>
</div>
</div>
</div>
</div>
</div>
<hr>
<!-----Log Out----------->
<div>
<button type="button" class="btn btn-default btn-md" onclick="LogOut()">
<span class="glyphicon glyphicon-log-out"></span> Log out
</button>
</div>
</div>
</body>
</html>
登录
通过登录,你同意了那些你根本懒得去读的荒谬的长条款
电子邮件
密码
居民支付状态门户
用户名
密码
登录
(函数(div,currency){var item_-total={currency_-code:currency,value:'50.00',},tax_-total={currency_-code:currency,value:'0.00'},render=function(){window.paypal.button({createOrder:function(data,actions){return actions.order.create({application_-context:{brand_-name:,landing_-page:“biling”),配送首选项:“NO_配送”,付款方式:{收款人首选:“无限制”},购买单位:[{描述:,软描述:“数字商品”,金额:{细分:{项目总数:项目总数,税收总额:税收总额},价值:'50.00',项目:[{名称:“月费”,数量:1,描述:,,sku:“1”,单位金额:项目总数,税收:税收总额]},onApprove:功能(数据,操作){return actions.order.capture().then(function(details){div.innerHTML=“order completed.You\x27很快就会收到电子邮件!”;}),onCancel:function(data){},onError:function(err){div.innerHTML=“+err.toString()})。render(“#digitalgoods-030521182921-1”);},init=function(){window.digitalgoodgoodgoodgoodgoodgoods=window.digitalgoodgoodgoodgoods=window;window.digitalgoods.push(呈现);var文件=”https://www.paypal.com/sdk/js?client-id=AS-86gVX_Dfakskq6yzdjrdkzb4smiziod5c9diky4extqrpb0vfeptleb_duki4bjqrewudflizef\x26currency=MYR;var script=document.createElement(“script”);script.type=“text/javascript”;script.src=file;script.onload=function(){var i=window.digitalgoods.length;而(i--{window.digitalgoods[i]();}};div.appendChild(script);};init();})(document.getElementById(“digitalgoods-030521182921-1”),“MYR”);
<style>
@import url('https://rsms.me/inter/inter-ui.css');
::selection {
background: #2D2F36;
}
::-webkit-selection {
background: #2D2F36;
}
::-moz-selection {
background: #2D2F36;
}
body {
background: white;
font-family: 'Inter UI', sans-serif;
margin: 0;
padding: 20px;
}
.page {
background: #e2e2e5;
display: flex;
flex-direction: column;
height: calc(100% - 40px);
position: absolute;
place-content: center;
width: calc(100% - 40px);
}
@media (max-width: 767px) {
.page {
height: auto;
margin-bottom: 20px;
padding-bottom: 20px;
}
}
.container {
display: flex;
height: 320px;
margin: 0 auto;
width: 640px;
}
@media (max-width: 767px) {
.container {
flex-direction: column;
height: 630px;
width: 320px;
}
}
.left {
background: white;
height: calc(100% - 40px);
top: 20px;
position: relative;
width: 50%;
}
@media (max-width: 767px) {
.left {
height: 100%;
left: 20px;
width: calc(100% - 40px);
max-height: 270px;
}
}
.login {
font-size: 50px;
font-weight: 900;
margin: 50px 40px 40px;
}
.eula {
color: #999;
font-size: 14px;
line-height: 1.5;
margin: 40px;
}
.right {
background: #474A59;
box-shadow: 0px 0px 40px 16px rgba(0,0,0,0.22);
color: #F1F1F2;
position: relative;
width: 50%;
}
@media (max-width: 767px) {
.right {
flex-shrink: 0;
height: 100%;
width: 100%;
max-height: 350px;
}
}
svg {
position: absolute;
width: 320px;
}
path {
fill: none;
stroke: url(#linearGradient);;
stroke-width: 4;
stroke-dasharray: 240 1386;
}
.form {
margin: 40px;
position: absolute;
}
label {
color: #c2c2c5;
display: block;
font-size: 14px;
height: 16px;
margin-top: 20px;
margin-bottom: 5px;
}
input {
background: transparent;
border: 0;
color: #f2f2f2;
font-size: 20px;
height: 30px;
line-height: 30px;
outline: none !important;
width: 100%;
}
input::-moz-focus-inner {
border: 0;
}
#submit {
color: #707075;
margin-top: 40px;
transition: color 300ms;
}
#submit:focus {
color: #f2f2f2;
}
#submit:active {
color: #d0d0d2;
}
</style>
修改密码
修改密码
&时代;
输入新密码
接近
保存更改
注销
斯洛金
<script>
var username = ""; // Added
function GetRecords() {
var spin = "<span class=\"spinner-border spinner-border-sm\" role=\"status\" aria-hidden=\"true\"></span>";
spin += " Loading...";
document.getElementById("LoginButton").innerHTML = spin;
username = document.getElementById("username").value; // Modified
var password = document.getElementById("password").value;
var password = document.getElementById("password").value;
google.script.run.withSuccessHandler(function(output) {
console.log(output);
var username = output[1];
var name = output[2];
if(output[0] == 'TRUE') {
document.getElementById("loginDisplay").style.display = "none";
document.getElementById("dataDisplay").style.display = "block";
document.getElementById("errorMessage").innerHTML = "";
document.getElementById("currentUser").value = name; // CHANGE
google.script.run.withSuccessHandler(displayTable).GetRecords(username,"None");
} else if(output[0] == 'FALSE') {
document.getElementById("firstLastName").innerHTML = "";
document.getElementById("currentUser").value = "";
document.getElementById("myFilter").innerHTML = "";
document.getElementById("errorMessage").innerHTML = "Failed to Login";
document.getElementById("LoginButton").innerHTML = "Login";
}
}).checkLogin(username, password);
}
function filter(){
var filterStr = document.getElementById("filterYear").value;
google.script.run.withSuccessHandler(displayTable).GetRecords(username, filterStr);
}
function displayTable(result) {
var ar = result.data;
var filterString = result.filter;
ar = ar.sort((a, b) => new Date(a).getTime() > new Date(b).getTime() ? -1 : 1).splice(-12); // <--- Added
var name = document.getElementById("currentUser").value; // CHANGE
if(ar.length > 0) {
var displayTable = '<table class=\"table\" id=\"mainTable\">';
displayTable += "<tr>";
displayTable += '<th style=\"text-align: center;\">Month</th>';
displayTable += '<th style=\"text-align: center;\">House Number</th>';
displayTable += '<th style=\"text-align: center;\">Street</th>';
displayTable += '<th style=\"text-align: center;\">Payment Status</th>';
displayTable += "</tr>";
ar.forEach(function(item, index) {
displayTable += "<tr>";
displayTable += "<td>"+item[0]+"</td>";
displayTable += "<td>"+item[1]+"</td>";
displayTable += "<td>"+item[2]+"</td>";
displayTable += "<td>"+item[3]+"</td>";
displayTable += "</tr>";
});
displayTable += "</table>";
} else {
var displayTable = "<span style=\"font-weight: bold\" >No Records Found</span>";
}
var filter = '';
if(filterString.length > 0) {
filter += '<label for="years" style="font-size: 20px">Select the Year</label><br><select class="form-control form-control-sm" id="filterYear" name="years" required><option value="" selected>Choose...</option>';
filterString.filter(String).forEach(str => {
filter += '<option value="'+str+'">'+str+'</option>';
});
filter += '</select><button class="btn btn-primary" type="button" id="FilterButton" onclick="filter()" >Submit</button>';
}
var today = new Date();
var year = today.getFullYear();
var month = today.getMonth();
if (!ar.some(([a,,,d]) => {
var t = new Date(a);
return year == t.getFullYear() && month == t.getMonth() && d.toUpperCase() == "PAID";
})) {
document.getElementById("digitalgoods-030521182921-1").style.display = "block";
}
document.getElementById("displayRecords").innerHTML = displayTable;
document.getElementById("firstLastName").innerHTML = "USER: " + name;
document.getElementById("myFilter").innerHTML = filter;
document.getElementById("LoginButton").innerHTML = "Login";
document.getElementById("username").value = '';
document.getElementById("password").value = '';
}
//change the link according to ur webapp latest version
function LogOut(){
window.open("https://script.google.com/macros/s/AKfycbwKa4sQ441WUIqmU40laBP0mfiqNMiN-NghEvwUnJY/dev",'_top');
}
function changePassword(){
var result = confirm("Want to Change Password?");
if (result) {
var newPassword = document.getElementById("newPassword").value;
google.script.run.withSuccessHandler(() => alert('Password changed')).changePassword(username, newPassword);
}
}
var current = null;
document.querySelector('#email').addEventListener('focus', function(e) {
if (current) current.pause();
current = anime({
targets: 'path',
strokeDashoffset: {
value: 0,
duration: 700,
easing: 'easeOutQuart'
},
strokeDasharray: {
value: '240 1386',
duration: 700,
easing: 'easeOutQuart'
}
});
});
document.querySelector('#password').addEventListener('focus', function(e) {
if (current) current.pause();
current = anime({
targets: 'path',
strokeDashoffset: {
value: -336,
duration: 700,
easing: 'easeOutQuart'
},
strokeDasharray: {
value: '240 1386',
duration: 700,
easing: 'easeOutQuart'
}
});
});
document.querySelector('#submit').addEventListener('focus', function(e) {
if (current) current.pause();
current = anime({
targets: 'path',
strokeDashoffset: {
value: -730,
duration: 700,
easing: 'easeOutQuart'
},
strokeDasharray: {
value: '530 1386',
duration: 700,
easing: 'easeOutQuart'
}
});
});
</script>
@导入url('https://rsms.me/inter/inter-ui.css');
::选择{
背景:#2D2F36;
}
:-网络工具包选择{
背景:#2D2F36;
}
:-moz选择{
背景:#2D2F36;
}
身体{
背景:白色;
字体系列:“Inter-UI”,无衬线;
保证金:0;
填充:20px;
}
.第页{
背景:#E2E5;
显示器:flex;
弯曲方向:立柱;
高度:计算(100%-40px);
位置:绝对位置;
地点内容:中心;
宽度:计算(100%-40p