index.vue 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. <template>
  2. <div
  3. class="absolute top-0 right-0 bottom-0 left-0 bg-[#f5f7f9] flex justify-center items-center overflow-auto"
  4. >
  5. <n-card class="w-[500px] shadow rounded-lg" :bordered="false">
  6. <template #header>
  7. <h2 class="text-center">冷链验证报告生成系统</h2>
  8. </template>
  9. <n-form
  10. ref="formRef"
  11. :rules="rules"
  12. :model="formValue"
  13. size="large"
  14. label-placement="left"
  15. >
  16. <n-form-item path="username">
  17. <n-input v-model:value="formValue.username" :maxlength="8" clearable>
  18. <template #prefix>
  19. <n-icon :component="UserOutlined" />
  20. </template>
  21. </n-input>
  22. </n-form-item>
  23. <n-form-item path="password">
  24. <n-input
  25. v-model:value="formValue.password"
  26. type="password"
  27. show-password-on="click"
  28. :maxlength="8"
  29. clearable
  30. >
  31. <template #prefix>
  32. <n-icon :component="LockOutlined" />
  33. </template>
  34. </n-input>
  35. </n-form-item>
  36. <n-form-item path="role">
  37. <n-select
  38. v-model:value="formValue.role"
  39. :options="generalOptions"
  40. clearable
  41. />
  42. </n-form-item>
  43. <n-form-item>
  44. <n-button type="primary" block @click="handleSubmit">登录</n-button>
  45. </n-form-item>
  46. </n-form>
  47. </n-card>
  48. </div>
  49. </template>
  50. <script setup>
  51. import { UserOutlined, LockOutlined } from "@vicons/antd";
  52. import { login } from "@/api";
  53. import md5 from "md5";
  54. import { setToken } from "@/utils/storage/sessionToken";
  55. const loadingBar = useLoadingBar();
  56. const formRef = ref(null);
  57. const router = useRouter();
  58. const message = useMessage();
  59. // 验证表项的规则
  60. const rules = {
  61. username: { required: true, message: "不能为空", trigger: "blur" },
  62. password: { required: true, message: "不能为空", trigger: "blur" },
  63. role: { required: true, message: "不能为空", trigger: ["blur", "change"] },
  64. };
  65. // 登录表单
  66. const formValue = reactive({
  67. username: "",
  68. password: "",
  69. role: "",
  70. });
  71. // 角色列表
  72. const generalOptions = ["管理员", "用户"].map((v) => ({
  73. label: v,
  74. value: v,
  75. }));
  76. const handleSubmit = async () => {
  77. formRef.value.validate(async (errors) => {
  78. if (!errors) {
  79. try {
  80. loadingBar.start();
  81. const { data: res } = await login(
  82. {
  83. bzd_username: formValue.username,
  84. bzd_password: md5(formValue.password),
  85. },
  86. formValue.role
  87. );
  88. if (res.Code === 200) {
  89. router.replace("/");
  90. message.success(res.Msg);
  91. setToken(res.Data);
  92. }
  93. } finally {
  94. loadingBar.finish();
  95. }
  96. } else {
  97. message.error("验证失败,请填写完整信息");
  98. }
  99. });
  100. };
  101. </script>
  102. <style lang="scss" scoped></style>