From 679a58a9a3daa4adf866bc94fe7de524a77011a1 Mon Sep 17 00:00:00 2001 From: 1ilit Date: Fri, 5 Jan 2024 21:38:59 +0200 Subject: [PATCH] Redo login page --- src/components/AuthCanvas.jsx | 244 ++++++++++++++++++++++++++ src/data/loginDiagram.js | 135 ++++++++++++++ src/data/signupDiagram.js | 71 ++++++++ src/pages/login.jsx | 160 +++++++++-------- src/pages/signup.jsx | 321 +--------------------------------- 5 files changed, 537 insertions(+), 394 deletions(-) create mode 100644 src/components/AuthCanvas.jsx create mode 100644 src/data/loginDiagram.js create mode 100644 src/data/signupDiagram.js diff --git a/src/components/AuthCanvas.jsx b/src/components/AuthCanvas.jsx new file mode 100644 index 0000000..d1965fb --- /dev/null +++ b/src/components/AuthCanvas.jsx @@ -0,0 +1,244 @@ +import { useEffect, useState, useRef } from "react"; +import { Cardinality } from "../data/data"; +import { calcPath } from "../utils"; + +function Table({ table, grab }) { + const [isHovered, setIsHovered] = useState(false); + const [hoveredField, setHoveredField] = useState(-1); + const height = table.fields.length * 36 + 50 + 7; + return ( + setIsHovered(true)} + onMouseLeave={() => setIsHovered(false)} + > +
+
+
+ {table.name} +
+ {table.fields.map((e, i) => ( +
setHoveredField(i)} + onMouseLeave={() => setHoveredField(-1)} + > +
+
+
{e.type}
+
+ ))} +
+ + ); +} + +function Relationship({ relationship }) { + const pathRef = useRef(); + let start = { x: 0, y: 0 }; + let end = { x: 0, y: 0 }; + + let cardinalityStart = "1"; + let cardinalityEnd = "1"; + + switch (relationship.cardinality) { + case Cardinality.MANY_TO_ONE: + cardinalityStart = "n"; + cardinalityEnd = "1"; + break; + case Cardinality.ONE_TO_MANY: + cardinalityStart = "1"; + cardinalityEnd = "n"; + break; + case Cardinality.ONE_TO_ONE: + cardinalityStart = "1"; + cardinalityEnd = "1"; + break; + default: + break; + } + + const length = 32; + + const [refAquired, setRefAquired] = useState(false); + useEffect(() => { + setRefAquired(true); + }, []); + + if (refAquired) { + const pathLength = pathRef.current.getTotalLength(); + const point1 = pathRef.current.getPointAtLength(length); + start = { x: point1.x, y: point1.y }; + const point2 = pathRef.current.getPointAtLength(pathLength - length); + end = { x: point2.x, y: point2.y }; + } + + return ( + console.log(pathRef.current)}> + + {pathRef.current && ( + <> + + + {cardinalityStart} + + + + {cardinalityEnd} + + + )} + + ); +} + +export default function Canvas({ diagram }) { + const [tables, setTables] = useState(diagram.tables); + const [relationships, setRelationships] = useState(diagram.relationships); + const [dragging, setDragging] = useState(-1); + const [offset, setOffset] = useState({ x: 0, y: 0 }); + + const grabTable = (e, id) => { + setDragging(id); + setOffset({ + x: e.clientX - tables[id].x, + y: e.clientY - tables[id].y, + }); + }; + + const moveTable = (e) => { + if (dragging !== -1) { + const dx = e.clientX - offset.x; + const dy = e.clientY - offset.y; + setTables((prev) => + prev.map((table, i) => { + if (i === dragging) { + setRelationships((prev) => + prev.map((r) => { + if (r.startTableId === i) { + return { + ...r, + startX: dx + 15, + startY: dy + r.startFieldId * 36 + 69, + endX: tables[r.endTableId].x + 15, + endY: tables[r.endTableId].y + r.endFieldId * 36 + 69, + }; + } else if (r.endTableId === i) { + return { + ...r, + startX: tables[r.startTableId].x + 15, + startY: tables[r.startTableId].y + r.startFieldId * 36 + 69, + endX: dx + 15, + endY: dy + r.endFieldId * 36 + 69, + }; + } + return r; + }) + ); + + return { + ...table, + x: dx, + y: dy, + }; + } + return table; + }) + ); + } + }; + + const releaseTable = () => { + setDragging(-1); + setOffset({ x: 0, y: 0 }); + }; + + return ( + + + + + + + + {tables.map((t, i) => ( + grabTable(e, i)} /> + ))} + {relationships.map((r, i) => ( + + ))} + + ); +} diff --git a/src/data/loginDiagram.js b/src/data/loginDiagram.js new file mode 100644 index 0000000..9c02131 --- /dev/null +++ b/src/data/loginDiagram.js @@ -0,0 +1,135 @@ +const xOffset = window.innerWidth * 0.57 * 0.09; +export const diagram = { + tables: [ + { + name: "galactic_users", + x: xOffset + 75, + y: window.innerHeight * 0.23 - (50 + 4 * 36 + 7) * 0.5, + fields: [ + { + name: "id", + type: "INT", + }, + { + name: "username", + type: "VARCHAR", + }, + { + name: "email", + type: "VARCHAR", + }, + { + name: "password", + type: "VARCHAR", + }, + ], + color: "#7d9dff", + }, + { + id: 1, + name: "celestial_data", + x: xOffset + 27, + y: window.innerHeight * 0.72 - (50 + 5 * 36 + 7) * 0.5, + fields: [ + { + name: "id", + type: "INT", + }, + { + name: "user_id", + type: "INT", + }, + { + name: "type", + type: "ENUM", + }, + { + name: "time", + type: "TIMESTAMP", + }, + { + name: "content", + type: "VARCHAR", + }, + ], + color: "#89e667", + }, + { + id: 2, + name: "astro_mine", + x: xOffset + 336, + y: window.innerHeight * 0.72 - (50 + 3 * 36 + 7) * 0.5, + fields: [ + { + name: "id", + type: "INT", + }, + { + name: "asteroid_id", + type: "INT", + }, + { + name: "data_id", + type: "INT", + }, + ], + color: "#6360f7", + }, + { + id: 3, + name: "asteroid", + x: xOffset + 310, + y: window.innerHeight * 0.23 - (50 + 3 * 36 + 7) * 0.5, + fields: [ + { + name: "id", + type: "INT", + }, + { + name: "name", + type: "VARCHAR", + }, + { + name: "location", + type: "VARCHAR", + }, + ], + color: "#3cde7d", + }, + ], + relationships: [ + { + startTableId: 1, + startFieldId: 1, + endTableId: 0, + endFieldId: 0, + startX: xOffset + 42, + startY: window.innerHeight * 0.72 - (4 * 36 + 50 + 7) * 0.5 + (50 + 18 * 2), + endX: xOffset + 90, + endY: window.innerHeight * 0.23 - (4 * 36 + 50 + 7) * 0.5 + (50 + 18 * 1), + cardinality: "Many to one", + }, + { + startTableId: 2, + startFieldId: 2, + endTableId: 1, + endFieldId: 0, + startX: xOffset + 351, + startY: window.innerHeight * 0.72 - (3 * 36 + 50 + 7) * 0.5 + (50 + 18 * 5), + endX: xOffset + 42, + endY: window.innerHeight * 0.72 - (5 * 36 + 50 + 7) * 0.5 + (50 + 18 * 1), + cardinality: "One to one", + }, + { + startTableId: 2, + startFieldId: 1, + endTableId: 3, + endFieldId: 0, + startX: xOffset + 351, + startY: window.innerHeight * 0.72 - (3 * 36 + 50 + 7) * 0.5 + (50 + 18 * 3), + endX: xOffset + 325, + endY: window.innerHeight * 0.23 - (3 * 36 + 50 + 7) * 0.5 + (50 + 18 * 1), + cardinality: "Many to one", + }, + ], +}; \ No newline at end of file diff --git a/src/data/signupDiagram.js b/src/data/signupDiagram.js new file mode 100644 index 0000000..d3ca800 --- /dev/null +++ b/src/data/signupDiagram.js @@ -0,0 +1,71 @@ +const xOffset = window.innerWidth * 0.42 * 0.15; +export const diagram = { + tables: [ + { + name: "galactic_users", + x: xOffset + 101, + y: window.innerHeight * 0.75 - (4 * 36 + 50 + 7) * 0.5, + fields: [ + { + name: "id", + type: "INT", + }, + { + name: "username", + type: "VARCHAR", + }, + { + name: "email", + type: "VARCHAR", + }, + { + name: "password", + type: "VARCHAR", + }, + ], + color: "#7d9dff", + }, + { + name: "celestial_data", + x: xOffset, + y: window.innerHeight * 0.32 - (5 * 36 + 50 + 7) * 0.5, + fields: [ + { + name: "id", + type: "INT", + }, + { + name: "user_id", + type: "INT", + }, + { + name: "type", + type: "ENUM", + }, + { + name: "time", + type: "TIMESTAMP", + }, + { + name: "content", + type: "VARCHAR", + }, + ], + color: "#89e667", + }, + ], + relationships: [ + { + startTableId: 1, + startFieldId: 1, + endTableId: 0, + endFieldId: 0, + startX: xOffset + 16, + startY: + window.innerHeight * 0.32 - (4 * 36 + 50 + 7) * 0.5 + (50 + 18 * 2), + endX: xOffset + 115, + endY: window.innerHeight * 0.75 - (4 * 36 + 50 + 7) * 0.5 + (50 + 18 * 1), + cardinality: "Many to one", + }, + ], +}; \ No newline at end of file diff --git a/src/pages/login.jsx b/src/pages/login.jsx index 565d9f2..3d6e5b0 100644 --- a/src/pages/login.jsx +++ b/src/pages/login.jsx @@ -1,8 +1,11 @@ import { useEffect, useState } from "react"; import { Link } from "react-router-dom"; -import logo from "../assets/logo_light_46.png"; -import { IconEyeClosedSolid, IconEyeOpened } from "@douyinfe/semi-icons"; +import logo from "../assets/icon_dark_64.png"; +import google_logo from "../assets/google.png"; +import github_logo from "../assets/github.png"; import axios from "axios"; +import Canvas from "../components/AuthCanvas"; +import { diagram } from "../data/loginDiagram"; export default function Login() { const [formValues, setFormValues] = useState({ @@ -23,9 +26,7 @@ export default function Login() { email: formValues.email, password: formValues.password, }) - .then((res) => { - console.log(res); - }) + .then(() => {}) .catch(() => {}); }; @@ -34,84 +35,89 @@ export default function Login() { }); return ( -
-
- - logo - -
- Welcome back! -
-
- - - -
- - +
- - -
- Don't have an account? - - Sign up here. - -
-
-
or
-
+
+
or
+
+
+
+ + + +
+ + +
+ +
+ Already have an account? + + Sign up here. + +
- -
-
+
+ + + + +
); } diff --git a/src/pages/signup.jsx b/src/pages/signup.jsx index 650ed00..85be38d 100644 --- a/src/pages/signup.jsx +++ b/src/pages/signup.jsx @@ -1,325 +1,12 @@ -import { useEffect, useState, useRef } from "react"; +import { useEffect, useState } from "react"; import { Link } from "react-router-dom"; import logo from "../assets/icon_dark_64.png"; import google_logo from "../assets/google.png"; import github_logo from "../assets/github.png"; import axios from "axios"; -import { Cardinality } from "../data/data"; -import { calcPath } from "../utils"; import { Toast } from "@douyinfe/semi-ui"; - -const xOffset = window.innerWidth * 0.42 * 0.15; -const diagram = { - tables: [ - { - name: "galactic_users", - x: xOffset + 101, - y: window.innerHeight * 0.75 - (4 * 36 + 50 + 7) * 0.5, - fields: [ - { - name: "id", - type: "INT", - }, - { - name: "username", - type: "VARCHAR", - }, - { - name: "email", - type: "VARCHAR", - }, - { - name: "password", - type: "VARCHAR", - }, - ], - color: "#7d9dff", - }, - { - name: "celestial_data", - x: xOffset, - y: window.innerHeight * 0.32 - (5 * 36 + 50 + 7) * 0.5, - fields: [ - { - name: "id", - type: "INT", - }, - { - name: "user_id", - type: "INT", - }, - { - name: "type", - type: "ENUM", - }, - { - name: "time", - type: "TIMESTAMP", - }, - { - name: "content", - type: "VARCHAR", - }, - ], - color: "#89e667", - }, - ], - relationships: [ - { - startTableId: 1, - startFieldId: 1, - endTableId: 0, - endFieldId: 0, - startX: xOffset + 16, - startY: - window.innerHeight * 0.32 - (4 * 36 + 50 + 7) * 0.5 + (50 + 18 * 2), - endX: xOffset + 115, - endY: window.innerHeight * 0.75 - (4 * 36 + 50 + 7) * 0.5 + (50 + 18 * 1), - cardinality: "One to one", - }, - ], -}; - -function Table({ table, grab }) { - const [isHovered, setIsHovered] = useState(false); - const [hoveredField, setHoveredField] = useState(-1); - const height = table.fields.length * 36 + 50 + 7; - return ( - setIsHovered(true)} - onMouseLeave={() => setIsHovered(false)} - > -
-
-
- {table.name} -
- {table.fields.map((e, i) => ( -
setHoveredField(i)} - onMouseLeave={() => setHoveredField(-1)} - > -
-
-
{e.type}
-
- ))} -
- - ); -} - -function Relationship({ relationship }) { - const pathRef = useRef(); - let start = { x: 0, y: 0 }; - let end = { x: 0, y: 0 }; - - let cardinalityStart = "1"; - let cardinalityEnd = "1"; - - switch (relationship.cardinality) { - case Cardinality.MANY_TO_ONE: - cardinalityStart = "n"; - cardinalityEnd = "1"; - break; - case Cardinality.ONE_TO_MANY: - cardinalityStart = "1"; - cardinalityEnd = "n"; - break; - case Cardinality.ONE_TO_ONE: - cardinalityStart = "1"; - cardinalityEnd = "1"; - break; - default: - break; - } - - const length = 32; - - const [refAquired, setRefAquired] = useState(false); - useEffect(() => { - setRefAquired(true); - }, []); - - if (refAquired) { - const pathLength = pathRef.current.getTotalLength(); - const point1 = pathRef.current.getPointAtLength(length); - start = { x: point1.x, y: point1.y }; - const point2 = pathRef.current.getPointAtLength(pathLength - length); - end = { x: point2.x, y: point2.y }; - } - - return ( - console.log(pathRef.current)}> - - {pathRef.current && ( - <> - - - {cardinalityStart} - - - - {cardinalityEnd} - - - )} - - ); -} - -function Canvas() { - const [tables, setTables] = useState(diagram.tables); - const [relationships, setRelationships] = useState(diagram.relationships); - const [dragging, setDragging] = useState(-1); - const [offset, setOffset] = useState({ x: 0, y: 0 }); - - const grabTable = (e, id) => { - setDragging(id); - setOffset({ - x: e.clientX - tables[id].x, - y: e.clientY - tables[id].y, - }); - }; - - const moveTable = (e) => { - if (dragging !== -1) { - const dx = e.clientX - offset.x; - const dy = e.clientY - offset.y; - setTables((prev) => - prev.map((table, i) => { - if (i === dragging) { - setRelationships((prev) => - prev.map((r) => { - if (r.startTableId === i) { - return { - ...r, - startX: dx + 15, - startY: dy + r.startFieldId * 36 + 69, - endX: tables[r.endTableId].x + 15, - endY: tables[r.endTableId].y + r.endFieldId * 36 + 69, - }; - } else if (r.endTableId === i) { - return { - ...r, - startX: tables[r.startTableId].x + 15, - startY: tables[r.startTableId].y + r.startFieldId * 36 + 69, - endX: dx + 15, - endY: dy + r.endFieldId * 36 + 69, - }; - } - return r; - }) - ); - - return { - ...table, - x: dx, - y: dy, - }; - } - return table; - }) - ); - } - }; - - const releaseTable = () => { - setDragging(-1); - setOffset({ x: 0, y: 0 }); - }; - - return ( - - - - - - - - {tables.map((t, i) => ( -
grabTable(e, i)} /> - ))} - {relationships.map((r, i) => ( - - ))} - - ); -} +import Canvas from "../components/AuthCanvas"; +import { diagram } from "../data/signupDiagram"; export default function SignUp() { const [formValues, setFormValues] = useState({ @@ -369,7 +56,7 @@ export default function SignUp() { return (
- +