From 90b290af1f25c7016d97c7e8c000151ea0baa0c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BF=97=E5=BC=BA?= <357099073@qq.com> Date: Wed, 1 Apr 2026 10:12:52 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/login.js | 60 ++++- src/api/sms.ts | 56 +++++ src/router/index.js | 15 +- .../apps/babyhealth/babys/components/edit.vue | 4 +- .../babyhealth/users/components/userEdit.vue | 4 +- .../apps/cms/articles/components/edit.vue | 4 +- src/views/basicSettings/users/index.vue | 32 ++- src/views/login/forget.vue | 127 +++++++++++ src/views/login/index.vue | 208 +++++++++++++++--- src/views/login/register.vue | 131 +++++++++++ .../system/smssettings/components/edit.vue | 149 +++++++++++++ src/views/system/smssettings/index.vue | 60 +++++ src/views/system/smssettings/tasklist.vue | 189 ++++++++++++++++ 13 files changed, 999 insertions(+), 40 deletions(-) create mode 100644 src/api/sms.ts create mode 100644 src/views/login/forget.vue create mode 100644 src/views/login/register.vue create mode 100644 src/views/system/smssettings/components/edit.vue create mode 100644 src/views/system/smssettings/index.vue create mode 100644 src/views/system/smssettings/tasklist.vue diff --git a/src/api/login.js b/src/api/login.js index 5b5f29d..a5de8b4 100644 --- a/src/api/login.js +++ b/src/api/login.js @@ -5,11 +5,25 @@ export function login(data) { return request({ url: `/admin/login`, method: "post", - data: { - tenant_name: data.tenant_name, - account: data.account, - password: data.password, - }, + data, + }); +} + +// 发送登录验证码(手机号) +export function sendLoginCode(data) { + return request({ + url: "/admin/sendLoginCode", + method: "post", + data, + }); +} + +// 手机号验证码登录 +export function loginBySms(data) { + return request({ + url: "/admin/loginBySms", + method: "post", + data, }); } // 登出 @@ -64,4 +78,40 @@ export function getOpenVerify() { url: '/admin/login/getOpenVerify', method: 'get' }); +} + +// 注册 +export function register(data) { + return request({ + url: "/admin/register", + method: "post", + data, + }); +} + +// 发送注册验证码 +export function sendRegisterCode(data) { + return request({ + url: "/admin/sendRegisterCode", + method: "post", + data, + }); +} + +// 忘记密码重置 +export function resetPassword(data) { + return request({ + url: "/admin/resetPassword", + method: "post", + data, + }); +} + +// 发送找回密码验证码 +export function sendResetCode(data) { + return request({ + url: "/admin/sendResetCode", + method: "post", + data, + }); } \ No newline at end of file diff --git a/src/api/sms.ts b/src/api/sms.ts new file mode 100644 index 0000000..b94d82a --- /dev/null +++ b/src/api/sms.ts @@ -0,0 +1,56 @@ +import request from "@/utils/request"; + +/** + * 获取短信网关配置 + */ +export function getSmsInfo() { + return request({ + url: "/admin/sms/info", + method: "get", + }); +} + +/** + * 编辑短信网关配置 + */ +export function editSmsInfo(data: any) { + return request({ + url: "/admin/sms/editinfo", + method: "post", + data, + }); +} + +/** + * 发送测试短信(入队任务,等待网关发送) + */ +export function sendTestSms(data: any) { + return request({ + url: "/admin/sms/sendtest", + method: "post", + data, + }); +} + +/** + * 获取短信任务列表(租户隔离) + */ +export function getSmsTaskList(params: { status?: string | number; phone?: string } = {}) { + return request({ + url: "/admin/sms/taskList", + method: "get", + params, + }); +} + +/** + * 编辑短信任务 + */ +export function editSmsTask(id: number | string, data: any) { + return request({ + url: `/admin/sms/taskEdit/${id}`, + method: "post", + data, + }); +} + diff --git a/src/router/index.js b/src/router/index.js index 3b54348..14f609f 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -24,6 +24,18 @@ const staticRoutes = [ component: () => import("@/views/login/index.vue"), meta: { requiresAuth: false } }, + { + path: "/register", + name: "Register", + component: () => import("@/views/login/register.vue"), + meta: { requiresAuth: false } + }, + { + path: "/forget", + name: "ForgetPassword", + component: () => import("@/views/login/forget.vue"), + meta: { requiresAuth: false } + }, { path: "/home", name: "Home", @@ -151,8 +163,9 @@ function findFirstValidRoute(routes) { router.beforeEach(async (to, from, next) => { const token = localStorage.getItem("token"); + const publicPaths = ["/login", "/register", "/forget"]; - if (to.path === "/login") { + if (publicPaths.includes(to.path)) { if (token) { if (!dynamicRoutesAdded) { await loadAndAddDynamicRoutes(); diff --git a/src/views/apps/babyhealth/babys/components/edit.vue b/src/views/apps/babyhealth/babys/components/edit.vue index 3ba28b4..7dac238 100644 --- a/src/views/apps/babyhealth/babys/components/edit.vue +++ b/src/views/apps/babyhealth/babys/components/edit.vue @@ -96,8 +96,8 @@ import { ref, reactive, watch, nextTick } from 'vue'; import { ElMessage, type FormInstance, type FormRules } from 'element-plus'; import { Plus, Picture } from '@element-plus/icons-vue'; -import { createBaby, editBaby } from '@/api/babyhealth'; -import { uploadAvatar } from '@/api/file'; +// import { createBaby, editBaby } from '@/api/babyhealth'; +// import { uploadAvatar } from '@/api/file'; import ImgCutter from 'vue-img-cutter'; diff --git a/src/views/apps/babyhealth/users/components/userEdit.vue b/src/views/apps/babyhealth/users/components/userEdit.vue index ab696a6..15880dd 100644 --- a/src/views/apps/babyhealth/users/components/userEdit.vue +++ b/src/views/apps/babyhealth/users/components/userEdit.vue @@ -87,8 +87,8 @@ import { ref, computed, watch } from "vue"; import { ElMessage } from "element-plus"; import { Plus } from '@element-plus/icons-vue'; import type { UploadProps, UploadRequestOptions } from 'element-plus'; -import { createUser, updateUser, getUserDetail } from "@/api/babyhealth"; -import { uploadAvatar } from '@/api/file'; +// import { createUser, updateUser, getUserDetail } from "@/api/babyhealth"; +// import { uploadAvatar } from '@/api/file'; const props = defineProps({ modelValue: { diff --git a/src/views/apps/cms/articles/components/edit.vue b/src/views/apps/cms/articles/components/edit.vue index 620f6d3..94d16d5 100644 --- a/src/views/apps/cms/articles/components/edit.vue +++ b/src/views/apps/cms/articles/components/edit.vue @@ -205,7 +205,7 @@ const cateOptions = ref([]); const form = reactive({ title: "", - author: "云泽网", + author: "", cate: "", content: "", image: "", @@ -503,7 +503,7 @@ function resetForm() { // 重置表单数据 Object.assign(form, { title: "", - author: "云泽网", + author: "", cate: "", content: "", image: "", diff --git a/src/views/basicSettings/users/index.vue b/src/views/basicSettings/users/index.vue index 3543927..0ef1af5 100644 --- a/src/views/basicSettings/users/index.vue +++ b/src/views/basicSettings/users/index.vue @@ -20,6 +20,16 @@ +
+ + + + + + + +
+ @@ -84,14 +94,16 @@ import { ref, onMounted } from "vue"; import { ElMessage, ElMessageBox } from "element-plus"; import { Plus, Refresh } from "@element-plus/icons-vue"; -import { getAllUsers, deleteUser } from "@/api/user"; +import { getTenantUsers, deleteUser } from "@/api/user"; import { getAllRoles } from "@/api/role"; +import { useAuthStore } from "@/stores/auth"; import UserEditDialog from "./components/userEdit.vue"; import ChangePasswordDialog from "./components/changePassword.vue"; import PreviewDialog from "./components/preview.vue"; interface User { id: number; + tid?: number; account: string; name: string; phone: string; @@ -121,6 +133,8 @@ const total = ref(0); const users = ref([]); const roles = ref([]); const loading = ref(false); +const authStore = useAuthStore(); +const selectedTenantId = ref(Number(authStore.user.tid || 0)); // 组件引用 const userEditRef = ref(); @@ -174,10 +188,17 @@ function getRoleTagText(roles: Role[] | undefined, group_id: number): string { const fetchUsers = async () => { loading.value = true; try { - const res = await getAllUsers(); - users.value = res.data.list; + if (!selectedTenantId.value) { + users.value = []; + total.value = 0; + return; + } + const res = await getTenantUsers(selectedTenantId.value); + users.value = res?.data?.list || []; + total.value = Number(res?.data?.total || 0); } catch (e) { users.value = []; + total.value = 0; } finally { loading.value = false; } @@ -254,12 +275,17 @@ const handleDelete = async (user: User) => { }; onMounted(async () => { + selectedTenantId.value = Number(authStore.user.tid || 0); fetchUsers(); fetchRoles(); }); + diff --git a/src/views/login/index.vue b/src/views/login/index.vue index c3d69e9..1bbb539 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -20,6 +20,10 @@