back_end e front_end, registro, dados etc. '-'

This commit is contained in:
2025-06-18 00:25:32 -03:00
parent fc2c573111
commit 9a818eee5f
13 changed files with 315 additions and 102 deletions

Binary file not shown.

View File

@@ -39,6 +39,11 @@ func main() {
Addr: "127.0.0.1:6379", Addr: "127.0.0.1:6379",
}) })
e.Use(middleware.CORSWithConfig(middleware.CORSConfig{
AllowOrigins: []string{"http://192.168.1.102"},
AllowCredentials: true,
}))
log.Println("Definindo configurações de Rate Limit") log.Println("Definindo configurações de Rate Limit")
rateLimiterStore := middleware.NewRateLimiterMemoryStoreWithConfig( rateLimiterStore := middleware.NewRateLimiterMemoryStoreWithConfig(
middleware.RateLimiterMemoryStoreConfig{ middleware.RateLimiterMemoryStoreConfig{
@@ -82,6 +87,7 @@ func main() {
e.GET("/", online) e.GET("/", online)
e.GET("roll", roll_get) e.GET("roll", roll_get)
e.POST("roll", roll)
e.GET("register", badreq) e.GET("register", badreq)
e.POST("register", registrar) e.POST("register", registrar)
e.POST("login", login, timeoutMiddleware, rateLimit) e.POST("login", login, timeoutMiddleware, rateLimit)

View File

@@ -5,10 +5,12 @@ import (
"fmt" "fmt"
"io" "io"
"log" "log"
"math/rand"
"net/http" "net/http"
"path/filepath" "path/filepath"
"regexp" "regexp"
"sort" "sort"
"strconv"
"strings" "strings"
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
@@ -32,7 +34,7 @@ func badreq(c echo.Context) error {
func registrar(c echo.Context) error { func registrar(c echo.Context) error {
player := c.FormValue("player") player := c.FormValue("player")
password := c.FormValue("password") password := c.FormValue("password")
confpass := c.FormValue("confirmpassowrd") confpass := c.FormValue("confirmpassword")
playerlore := c.FormValue("playerlore") playerlore := c.FormValue("playerlore")
if !regexp.MustCompile(`^[a-zA-Z0-9_]+$`).MatchString(player) { if !regexp.MustCompile(`^[a-zA-Z0-9_]+$`).MatchString(player) {
@@ -198,6 +200,56 @@ func login(c echo.Context) error {
}) })
} }
func roll(c echo.Context) error {
userSession, err := ValidSession(c)
if err != nil {
return c.JSON(http.StatusUnauthorized, resp_json{
Status: "Error",
Message: err.Error(),
})
}
roll, err := strconv.Atoi(c.FormValue("roll"))
if err != nil {
return c.JSON(http.StatusBadRequest, resp_json{
Status: "Error",
Message: "algo deu errado ao rola seu dado, tente novamente",
})
}
var dado int
switch roll {
case 6:
dado = rand.Intn(roll) + 1
case 10:
dado = rand.Intn(roll) + 1
case 20:
dado = rand.Intn(roll) + 1
case 40:
dado = rand.Intn(roll) + 1
case 50:
dado = rand.Intn(roll) + 1
case 100:
dado = rand.Intn(roll) + 1
default:
return c.JSON(http.StatusBadRequest, resp_json{
Status: "Error",
Message: "você so pode rodar dados de 6, 10, 20, 40, 50 ou 100",
})
}
var value string = fmt.Sprintf("%s rolou 1d%v e o resultado é %v", userSession["playerName"], roll, dado)
_, err = db.Exec("INSERT INTO roll_logs (id, log) VALUES (NULL, ?);", value)
if err != nil {
return c.JSON(http.StatusInternalServerError, resp_json{
Status: "Error",
Message: "não foi possivel inserir o log do da rolagem no banco de dados",
})
}
return c.JSON(http.StatusOK, resp_json{
Status: "Success",
Message: value,
})
}
func roll_get(c echo.Context) error { func roll_get(c echo.Context) error {
row, err := db.Query("SELECT * FROM roll_logs ORDER BY id DESC LIMIT 5;") row, err := db.Query("SELECT * FROM roll_logs ORDER BY id DESC LIMIT 5;")
if err != nil { if err != nil {

View File

@@ -60,3 +60,7 @@ body {
#loginBtn:hover { #loginBtn:hover {
background-color: var(--lines); background-color: var(--lines);
} }
a span {
overflow: hidden;
}

View File

@@ -1,21 +1,28 @@
* {
box-sizing: border-box;
}
#playerDATA { #playerDATA {
background-color: var(--subbgcolor); background-color: var(--subbgcolor);
padding: 1dvw; padding: 1dvw;
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
flex-wrap: wrap;
gap: 1vw;
#hero { #hero {
width: 15%; width: 15%;
height: 30%; height: auto;
max-height: 30dvh;
border: solid 3px var(--backredcolor); border: solid 3px var(--backredcolor);
border-radius: 100dvh; border-radius: 100dvh;
object-fit: cover; object-fit: cover;
} }
ul { ul {
padding: 0 0 0 1vw; padding-left: 1vw;
width: 100%; width: 80%;
li { li {
display: flex; display: flex;
@@ -23,9 +30,10 @@
padding: 1dvh; padding: 1dvh;
font-size: 1.5em; font-size: 1.5em;
border-bottom: dotted 2px var(--lines); border-bottom: dotted 2px var(--lines);
flex-wrap: wrap;
p { p {
margin: 0 0 0 1dvh; margin-left: 1dvh;
} }
a { a {
@@ -38,7 +46,6 @@
border-radius: 1dvh; border-radius: 1dvh;
cursor: pointer; cursor: pointer;
transition: 0.3s; transition: 0.3s;
overflow: hidden;
} }
a:hover { a:hover {
@@ -50,27 +57,34 @@
#box_1 { #box_1 {
display: flex; display: flex;
flex-wrap: wrap;
border-bottom: solid 0.5dvh var(--backredcolor); border-bottom: solid 0.5dvh var(--backredcolor);
h1 { h1 {
min-height: 4dvh;
width: 100%; width: 100%;
background: var(--btncolor); background: var(--btncolor);
font-family: "Share Tech Mono", monospace; font-family: "Share Tech Mono", monospace;
padding: 0 0 0 1dvh; padding-left: 1dvh;
} }
} }
#status,
#dados,
#inv,
#powers {
min-height: 40dvh;
max-height: 40dvh;
overflow: hidden;
background-color: var(--subbgcolor);
}
#status { #status {
width: 25%; width: 25%;
min-height: 40dvh;
max-height: 40dvh;
border-right: solid 1px var(--lines); border-right: solid 1px var(--lines);
overflow: hidden;
background-color: var(--subbgcolor);
ul { ul {
padding: 3vw 0 3vw 0; padding: 3vw 0;
max-height: 100%;
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
align-items: center; align-items: center;
@@ -82,13 +96,13 @@
border-radius: 1dvw; border-radius: 1dvw;
label { label {
padding: 0 0 0 1dvh; padding-left: 1dvh;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
p { p {
margin: 0 0.2dvh 0 0.2dvh; margin: 0 0.2dvh;
} }
span { span {
@@ -121,17 +135,14 @@
#dados { #dados {
width: 30%; width: 30%;
min-height: 40dvh; display: flex;
max-height: 40dvh; flex-direction: column;
border-right: solid 1px var(--lines); border-right: solid 1px var(--lines);
overflow: hidden;
#list { #list {
width: 100%; width: 100%;
height: 50%; min-height: 20dvh;
overflow: hidden; overflow-y: auto;
overflow-y: scroll;
background-color: var(--subbgcolor);
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
align-items: center; align-items: center;
@@ -140,57 +151,55 @@
li { li {
transition: 0.3s; transition: 0.3s;
border-radius: 1dvh; border-radius: 1vh;
margin: 0 0 0 1dvh; margin: 1vh;
background: var(--btncolor); background: var(--btncolor);
width: 45%; width: 45%;
cursor: pointer; cursor: pointer;
a { a {
padding: 1dvh; padding: 1vh;
display: flex; display: flex;
font-size: 1.5em; font-size: 1.5em;
align-items: center; align-items: center;
span { span {
margin: 0 1dvw 0 0; margin-right: 1vw;
}
} }
} }
li:hover { &:hover {
background-color: var(--lines); background-color: var(--lines);
} }
} }
}
#log { #log {
width: 100%; flex-grow: 1;
height: calc(40dvh - 12dvw); overflow-y: auto;
overflow-y: scroll;
li { li {
cursor: pointer;
font-size: 1.5em; font-size: 1.5em;
padding: 0.5dvh 0 0.5dvh 2dvh; padding: 0.5vh 2vh;
&:hover {
background-color: var(--lines);
}
} }
} }
} }
#inv { #inv {
position: relative;
width: 30%; width: 30%;
overflow: hidden; position: relative;
min-height: 40dvh;
max-height: 40dvh;
border-right: solid 1px var(--lines); border-right: solid 1px var(--lines);
ul { ul {
overflow: hidden;
overflow-y: scroll; overflow-y: scroll;
width: 100%;
max-height: 80%;
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
justify-content: flex-start; justify-content: flex-start;
max-height: 80%;
li { li {
width: calc(100% / 4 - 2px); width: calc(100% / 4 - 2px);
@@ -202,7 +211,7 @@
justify-content: center; justify-content: center;
position: relative; position: relative;
cursor: pointer; cursor: pointer;
cursor: pointer;
a { a {
position: absolute; position: absolute;
right: 1dvh; right: 1dvh;
@@ -210,18 +219,22 @@
background-color: var(--backredcolor); background-color: var(--backredcolor);
cursor: pointer; cursor: pointer;
transition: 0.3s; transition: 0.3s;
span { span {
overflow: hidden; overflow: hidden;
} }
} }
&:hover {
background-color: var(--subbgcolor);
}
a:hover { a:hover {
background-color: var(--backdarkredcolor); background-color: var(--backdarkredcolor);
} }
} }
li:hover { li:hover {
background-color: var(--subbgcolor); background-color: var(--lines);
} }
} }
@@ -235,33 +248,26 @@
bottom: 0; bottom: 0;
background-color: var(--subbgcolor); background-color: var(--subbgcolor);
select { select,
input,
#btn {
background-color: var(--btncolor); background-color: var(--btncolor);
padding: 5px; padding: 5px;
border: none; border: none;
margin: 0 0.5dvh;
} }
#btn { #btn {
transition: 0.3s; transition: 0.3s;
background-color: var(--btncolor);
display: flex;
justify-content: center;
align-items: center;
margin: 0 1dvh 0 1dvh;
padding: 5px;
border-radius: 1dvh; border-radius: 1dvh;
}
#btn:hover { &:hover {
background-color: var(--lines); background-color: var(--lines);
} }
}
input { input {
margin: 0 0.5dvh 0 0.5dvh;
background-color: var(--lines);
color: var(--fontcolor); color: var(--fontcolor);
border: none;
padding: 5px;
} }
input[type="number"] { input[type="number"] {
@@ -270,11 +276,11 @@
label { label {
display: flex; display: flex;
justify-content: center;
align-items: center; align-items: center;
a { a {
border-radius: 1dvh 0 1dvh 0; border-radius: 1dvh 0 1dvh 0;
span { span {
overflow: hidden; overflow: hidden;
font-size: 1em; font-size: 1em;
@@ -285,20 +291,13 @@
} }
#powers { #powers {
width: calc(100% - (30% + 25% + 30% - 3px)); width: calc(100% - (30% + 25% + 30%));
overflow: hidden;
min-height: 40dvh;
max-height: 40dvh;
background-color: var(--subbgcolor);
ul { ul {
overflow: hidden;
overflow-y: scroll;
width: 100%;
height: 100%; height: 100%;
overflow-y: scroll;
li { li {
width: 100%;
padding: 1dvh; padding: 1dvh;
border-top: dotted 2px var(--lines); border-top: dotted 2px var(--lines);
cursor: pointer; cursor: pointer;
@@ -307,22 +306,20 @@
a { a {
font-size: 1.5em; font-size: 1.5em;
} }
}
li:hover { &:hover {
background-color: var(--btncolor); background-color: var(--btncolor);
} }
} }
}
} }
#FloatInput { #FloatInput {
position: absolute; position: absolute;
width: 10%; width: 10%;
display: flex; z-index: 100;
z-index: 100px;
input[type="text"] { input[type="text"] {
position: relative;
width: 100%; width: 100%;
border: solid 1px var(--backredcolor); border: solid 1px var(--backredcolor);
border-radius: 10dvh; border-radius: 10dvh;
@@ -333,20 +330,23 @@
} }
} }
/* Responsividade */
@media only screen and (max-width: 1080px) { @media only screen and (max-width: 1080px) {
#playerDATA { #playerDATA {
height: 40dvh; flex-direction: column;
align-items: center;
height: auto;
#hero { #hero {
width: 40vh; width: 40vw;
height: 25vh; height: 40vw;
} }
ul { ul li {
li {
font-size: 1em; font-size: 1em;
} }
} }
}
#box_1 { #box_1 {
flex-direction: column; flex-direction: column;
#dados, #dados,
@@ -354,21 +354,43 @@
#inv, #inv,
#powers { #powers {
width: 100%; width: 100%;
min-height: 100dvw; min-height: 43vh;
#list { hgroup input[type="text"] {
height: 30dvh; width: 20dvw;
}
hgroup input[type="number"] {
width: 8dvw;
}
}
#status li {
border-top-right-radius: 2dvh;
border-bottom-right-radius: 2dvh;
label {
a {
display: flex;
align-content: center;
align-items: center;
} }
} }
} }
#inv { #dados #list {
ul { height: 30dvh;
}
}
#inv ul {
max-height: 43vh; max-height: 43vh;
li { li {
height: calc(100dvh / 6 - 2px); min-width: calc(100% / 4);
} max-width: calc(100% / 4);
min-height: calc(100% / 4);
mix-height: calc(100% / 4);
} }
} }
#FloatInput { #FloatInput {
width: 30%; width: 30%;
transform: translateY(50px) translateX(-50px); transform: translateY(50px) translateX(-50px);

View File

@@ -7,6 +7,8 @@
<link rel="stylesheet" href="css/base.css" /> <link rel="stylesheet" href="css/base.css" />
<link rel="stylesheet" href="css/style.css" /> <link rel="stylesheet" href="css/style.css" />
<script type="text/javascript" src="javascript/libs/jquery.js"></script> <script type="text/javascript" src="javascript/libs/jquery.js"></script>
<script type="text/javascript" src="javascript/libs/tata.js"></script>
<script type="text/javascript" src="javascript/globais.js"></script>
</head> </head>
<body> <body>
<div id="playerDATA"> <div id="playerDATA">
@@ -129,13 +131,7 @@
</a> </a>
</li> </li>
</ul> </ul>
<ul id="log"> <ul id="log"></ul>
<li>
<label
>{user} rolou {dado} e o resultado é {valor}</label
>
</li>
</ul>
</div> </div>
<div id="status"> <div id="status">
<h1>Player Status</h1> <h1>Player Status</h1>
@@ -338,5 +334,6 @@
<!-- scripts --> <!-- scripts -->
<script type="text/javascript" src="javascript/script.js"></script> <script type="text/javascript" src="javascript/script.js"></script>
<script type="text/javascript" src="javascript/load_ficha.js"></script>
</body> </body>
</html> </html>

11
rpg/javascript/globais.js Normal file
View File

@@ -0,0 +1,11 @@
window.api = "http://192.168.1.102:8085/";
window.msg = (status, msg) => {
tata.text(status, msg, {
position: "br",
duration: 3000,
progress: true,
closeBtn: true,
animate: "slide",
});
};

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,41 @@
let update;
function roll_load() {
$.ajax({
url: window.api + "roll",
type: "GET",
xhrFields: {
withCredentials: true,
},
success: function (resp) {
switch (update) {
case undefined:
resp.Logs.forEach(function (item) {
$("#log").append(`<li><label>${item.log}</label></li>`);
update = item.id;
});
break;
default:
resp.Logs.forEach(function (item) {
if (item.id > update) {
$("#log").append(`<li><label>${item.log}</label></li>`);
update = item.id;
}
});
break;
}
$("#log").scrollTop($("#log")[0].scrollHeight);
},
error: function (resp, status, jqXHR) {
/*msg(
resp.responseJSON?.Status || "Erro",
resp.responseJSON?.Message || "Algo deu errado.",
);*/
},
});
}
$(document).ready(function () {
setInterval(function () {
roll_load();
}, 1000);
});

View File

@@ -1,3 +1,18 @@
function verifyInputs(player, passwd, confpasswd, lore) {
if (
player &&
!player.includes(" ") &&
passwd &&
!passwd.includes(" ") &&
confpasswd &&
!confpasswd.includes(" ") &&
lore
) {
return true;
}
return false;
}
$("#imgClick").on("click", () => $("#inputImagem").click()); $("#imgClick").on("click", () => $("#inputImagem").click());
$("#inputImagem").on("change", function () { $("#inputImagem").on("change", function () {
@@ -8,3 +23,60 @@ $("#inputImagem").on("change", function () {
reader.readAsDataURL(file); reader.readAsDataURL(file);
} }
}); });
$(document).ready(function () {
$("#loginBtn").on("click", function () {
const $btn = $(this);
$btn.prop("disabled", true).val("Criando conta...");
const fileInput = $("#inputImagem")[0];
const file = fileInput.files[0];
const player = $("#loginInput[name='player']").val();
const password = $("#loginInput[name='password']").val();
const confPassword = $("#loginInput[name='confirmpassword']").val();
const lore = $("#playerlore[name='playerlore']").val();
if (!file) {
msg("Error", "Você é obrigado a colocar uma imagem.");
return finalizarErro($btn, "Registrar");
}
if (!verifyInputs(player, password, confPassword, lore)) {
msg("Error", "Por favor, preencha todos os dados corretamente.");
return finalizarErro($btn, "Registrar");
}
const form = new FormData();
form.append("PlayerImage", fileInput.files[0]);
form.append("player", player);
form.append("password", password);
form.append("confirmpassword", confPassword);
form.append("playerlore", lore);
console.log(form);
$.ajax({
url: window.api + "register",
type: "POST",
data: form,
contentType: false,
processData: false,
xhrFields: { withCredentials: true },
success: function (resp) {
msg(resp.Status, resp.Message);
$btn.val("Concluído");
window.location.href = "index.html";
},
error: function (resp) {
msg(
resp.responseJSON?.Status || "Erro",
resp.responseJSON?.Message || "Algo deu errado.",
);
finalizarErro($btn, "Registrar");
},
});
});
function finalizarErro($btn, texto = "Registrar") {
$btn.prop("disabled", false).val(texto);
}
});

View File

@@ -11,18 +11,20 @@ function editInput(name, x, y) {
`; `;
$inp = $(input).appendTo("body").focus(); $inp = $(input).appendTo("body").focus();
$inp.on("keypress keydown", function (e) { $inp.on("keydown", function (e) {
if (e.which === 13) { if (e.which === 13) {
switch ($(this).find("input").val().length > 0) { switch ($(this).find("input").val().length > 0) {
case true: case true:
console.log($(this).find("input").val()); console.log($(this).find("input").val());
// aqui vai enviar a request, não esqueça zk alert($(this).find("input").val());
break; break;
case false: case false:
$(this).remove(); $(this).remove();
break; break;
} }
} }
});
$inp.on("keypress keydown", function (e) {
switch (e.key) { switch (e.key) {
case "Delete": case "Delete":
$(this).remove(); $(this).remove();
@@ -46,6 +48,6 @@ $(document).ready(function () {
let nameclass = let nameclass =
reqbtn.length > 1 reqbtn.length > 1
? editInput(reqbtn[1], cordX, cordY) ? editInput(reqbtn[1], cordX, cordY)
: console.error("erro,coloque uma seunda cleass"); : msg("Error", "erro, ainda não foi definido a classe desse botão");
}); });
}); });

View File

@@ -7,6 +7,8 @@
<link rel="stylesheet" href="css/base.css" /> <link rel="stylesheet" href="css/base.css" />
<link rel="stylesheet" href="css/login.css" /> <link rel="stylesheet" href="css/login.css" />
<script type="text/javascript" src="javascript/libs/jquery.js"></script> <script type="text/javascript" src="javascript/libs/jquery.js"></script>
<script type="text/javascript" src="javascript/libs/tata.js"></script>
<script type="text/javascript" src="javascript/globais.js"></script>
</head> </head>
<body> <body>
<div id="login_form"> <div id="login_form">

View File

@@ -7,6 +7,8 @@
<link rel="stylesheet" href="css/base.css" /> <link rel="stylesheet" href="css/base.css" />
<link rel="stylesheet" href="css/register.css" /> <link rel="stylesheet" href="css/register.css" />
<script type="text/javascript" src="javascript/libs/jquery.js"></script> <script type="text/javascript" src="javascript/libs/jquery.js"></script>
<script type="text/javascript" src="javascript/libs/tata.js"></script>
<script type="text/javascript" src="javascript/globais.js"></script>
</head> </head>
<body> <body>
<div id="register_form"> <div id="register_form">
@@ -33,7 +35,7 @@
<li> <li>
<input <input
type="password" type="password"
name="passowrd" name="password"
placeholder="senha" placeholder="senha"
id="loginInput" id="loginInput"
/> />
@@ -41,13 +43,14 @@
<li> <li>
<input <input
type="password" type="password"
name="confirmpassowrd" name="confirmpassword"
placeholder="confirme senha" placeholder="confirme senha"
id="loginInput" id="loginInput"
/> />
</li> </li>
<li> <li>
<textarea <textarea
id="playerlore"
name="playerlore" name="playerlore"
placeholder="escreva a historia do seu personagem" placeholder="escreva a historia do seu personagem"
></textarea> ></textarea>