@scenemesh/entity-engine
Version: 
一个“元数据驱动 + 组件适配 + 动态关系 + 视图管线”式的实体引擎。以 **Model + View + FieldType + SuiteAdapter + DataSource** 为五大支点,统一 CRUD / 查询 / 引用管理 / 视图渲染 / 扩展注册,支持在运行期无侵入拼装出 **表单、网格、主从、看板、仪表盘、流程/树形视图** 等多形态界面。
145 lines (143 loc) • 4.61 kB
JavaScript
import {
  EntityView,
  useEntityEngine,
  useEntitySession,
  useMasterDetailViewContainer
} from "./chunk-2MQEKMBU.mjs";
// src/modules/build-in/views/auth/auth-view-comp.tsx
import { useState } from "react";
import { notifications } from "@mantine/notifications";
import {
  Text,
  Paper,
  Title,
  Anchor,
  Button,
  Checkbox,
  TextInput,
  PasswordInput
} from "@mantine/core";
import { jsx, jsxs } from "react/jsx-runtime";
function AuthViewLoginComp(props) {
  const { model, baseObjectId, viewData, behavior } = props;
  const [username, setUsername] = useState("");
  const [password, setPassword] = useState("");
  const [rememberMe, setRememberMe] = useState(false);
  const [error, setError] = useState("");
  const engine = useEntityEngine();
  const { session, sessionRefresh } = useEntitySession();
  const { performAction } = useMasterDetailViewContainer();
  const getCsrfToken = async () => {
    const response = await fetch(engine.settings.getUrl("/auth/csrf"));
    const { csrfToken } = await response.json();
    return csrfToken;
  };
  const handleSubmit = async (e) => {
    e.preventDefault();
    const csrfToken = await getCsrfToken();
    if (!csrfToken) {
      setError("Could not retrieve CSRF token.");
      return;
    }
    const body = new URLSearchParams();
    body.append("csrfToken", csrfToken);
    body.append("username", username);
    body.append("password", password);
    body.append("remember", rememberMe ? "true" : "false");
    body.append("json", "true");
    body.append("redirect", "false");
    const response = await fetch(engine.settings.getUrl("/auth/callback/credentials"), {
      method: "POST",
      headers: {
        "Content-Type": "application/x-www-form-urlencoded"
      },
      body
    });
    if (response.ok && response.status === 200) {
      console.log("Login successful", response);
      notifications.show({
        title: "\u767B\u5F55\u6210\u529F",
        message: "\u6B22\u8FCE\u56DE\u6765\uFF0C\u4F60\u5DF2\u6210\u529F\u767B\u5F55\u3002",
        color: "green",
        autoClose: 5e3
      });
      await sessionRefresh?.();
      window.location.reload();
    } else {
      setError("\u90AE\u7BB1\u6216\u5BC6\u7801\u9519\u8BEF.");
    }
  };
  return /* @__PURE__ */ jsx("div", { className: "entity-auth-wrapper", children: /* @__PURE__ */ jsxs(Paper, { className: "entity-auth-form", children: [
    /* @__PURE__ */ jsx(Title, { order: 2, className: "entity-auth-title", children: "\u6B22\u8FCE\u767B\u5F55" }),
    /* @__PURE__ */ jsxs("form", { onSubmit: handleSubmit, children: [
      error && /* @__PURE__ */ jsx(Text, { c: "red", children: error }),
      /* @__PURE__ */ jsx(
        TextInput,
        {
          label: "\u90AE\u7BB1\u5730\u5740",
          placeholder: "hello@gmail.com",
          size: "md",
          radius: "md",
          onChange: (e) => setUsername(e.target.value)
        }
      ),
      /* @__PURE__ */ jsx(
        PasswordInput,
        {
          label: "\u767B\u5F55\u5BC6\u7801",
          placeholder: "Your password",
          mt: "md",
          size: "md",
          radius: "md",
          onChange: (e) => setPassword(e.target.value)
        }
      ),
      /* @__PURE__ */ jsx(
        Checkbox,
        {
          label: "\u4FDD\u6301\u767B\u5F55",
          mt: "xl",
          size: "md",
          onChange: (e) => setRememberMe(e.target.checked)
        }
      ),
      /* @__PURE__ */ jsx(
        Button,
        {
          fullWidth: true,
          mt: "xl",
          size: "md",
          radius: "md",
          type: "submit",
          onClick: handleSubmit,
          children: "\u767B\u5F55"
        }
      ),
      /* @__PURE__ */ jsxs(Text, { ta: "center", mt: "md", children: [
        "\u8FD8\u6CA1\u6709\u5BC6\u7801?",
        " ",
        /* @__PURE__ */ jsx(Anchor, { href: "#", fw: 500, onClick: (event) => event.preventDefault(), children: "\u6CE8\u518C" })
      ] })
    ] })
  ] }) });
}
// src/modules/build-in/views/auth/auth.view.tsx
import { jsx as jsx2 } from "react/jsx-runtime";
var AuthView = class extends EntityView {
  constructor() {
    super(...arguments);
    this.info = {
      viewName: "auth",
      displayName: "\u8BA4\u8BC1\u89C6\u56FE",
      icon: "auth_icon",
      description: "\u8BA4\u8BC1\u89C6\u56FE, \u5305\u542B\u767B\u5F55\u3001\u6CE8\u518C\u7B49\u529F\u80FD"
    };
    this.Component = (props) => /* @__PURE__ */ jsx2(AuthViewLoginComp, { ...props });
  }
};
var auth_view_default = AuthView;
export {
  AuthView,
  auth_view_default as default
};
//# sourceMappingURL=auth.view-77EA2JLU.mjs.map