feat(安全): 实现JWT认证和HTTPS支持

- 添加JWT认证中间件保护API端点
- 在登录流程中使用bcrypt哈希密码和JWT令牌
- 配置HTTPS服务器使用自签名证书
- 更新前端API调用以包含认证令牌
This commit is contained in:
sudomarcma
2025-06-26 10:41:23 +08:00
parent 0ed8e4af30
commit e563f17283
10 changed files with 1357 additions and 69 deletions
+16 -25
View File
@@ -99,6 +99,8 @@
import { ref, onMounted, computed, watch } from 'vue'
import { useRouter } from 'vue-router'
import { apiFetch } from '@/api.js'
const router = useRouter()
const workers = ref([])
const loading = ref(false)
@@ -131,15 +133,12 @@ watch(searchQuery, () => {
const fetchWorkers = async (page = currentPage.value) => {
loading.value = true
try {
const res = await fetch(
`${import.meta.env.VITE_API_BASE_URL}/api/managers/workers?search=${searchQuery.value}&page=${page}&limit=${pageSize.value}`,
const data = await apiFetch(
`/api/managers/workers?search=${searchQuery.value}&page=${page}&limit=${pageSize.value}`,
)
if (res.ok) {
const data = await res.json()
workers.value = data.workers
totalWorkers.value = data.totalCount
currentPage.value = page
}
workers.value = data.workers
totalWorkers.value = data.totalCount
currentPage.value = page
} catch (err) {
errorMessage.value = 'Failed to fetch workers.'
console.error(err)
@@ -159,18 +158,12 @@ const addWorker = async () => {
loading.value = true
errorMessage.value = ''
try {
const res = await fetch(`${import.meta.env.VITE_API_BASE_URL}/api/managers/workers`, {
const data = await apiFetch('/api/managers/workers', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(newWorker.value),
})
const data = await res.json()
if (res.ok) {
await fetchWorkers(1) // Refresh list to the first page
newWorker.value = { fullName: '', username: '', password: '' } // Clear form
} else {
errorMessage.value = data.message
}
await fetchWorkers(1) // Refresh list to the first page
newWorker.value = { fullName: '', username: '', password: '' } // Clear form
} catch (err) {
errorMessage.value = 'An error occurred while adding the worker.'
console.error(err)
@@ -182,16 +175,14 @@ const addWorker = async () => {
const deleteWorker = async (id) => {
if (!confirm('Are you sure you want to delete this worker account?')) return
try {
const res = await fetch(`${import.meta.env.VITE_API_BASE_URL}/api/managers/workers/${id}`, {
await apiFetch(`/api/managers/workers/${id}`, {
method: 'DELETE',
})
if (res.ok) {
// If the deleted worker was the last on the page, go to the previous page
if (workers.value.length === 1 && currentPage.value > 1) {
await fetchWorkers(currentPage.value - 1)
} else {
await fetchWorkers(currentPage.value)
}
// If the deleted worker was the last on the page, go to the previous page
if (workers.value.length === 1 && currentPage.value > 1) {
await fetchWorkers(currentPage.value - 1)
} else {
await fetchWorkers(currentPage.value)
}
} catch (err) {
errorMessage.value = 'Failed to delete worker.'