diff --git a/Merge/front/src/api/posts_trm.js b/Merge/front/src/api/posts_trm.js
index f28ec19..43d7105 100644
--- a/Merge/front/src/api/posts_trm.js
+++ b/Merge/front/src/api/posts_trm.js
@@ -1,16 +1,20 @@
+import { getAuthToken } from '../utils/auth'
 const BASE = 'http://10.126.59.25:5713'  // 后端地址
 
+
+
 /**
  * 获取待审核的帖子列表
  * POST /apostlist
  * @param {number|string} userId 平台管理员的用户 ID
  * @returns Promise<[ {id, title, status}, … ]>
  */
-export async function fetchPosts(userId) {
+export async function fetchPosts() {
+  const userid = getAuthToken()
   const res = await fetch(`${BASE}/apostlist`, {
     method: 'POST',
     headers: { 'Content-Type': 'application/json' },
-    body: JSON.stringify({ userid: userId })
+    body: JSON.stringify({ userid })
   })
   if (!res.ok) throw new Error(`fetchPosts: ${res.status}`)
   
@@ -43,11 +47,12 @@
  * 审核通过
  * POST /areview
  */
-export async function approvePost(postId, userId) {
+export async function approvePost(postId) {
+  const userid = getAuthToken()
   const res = await fetch(`${BASE}/areview`, {
     method: 'POST',
     headers: { 'Content-Type': 'application/json' },
-    body: JSON.stringify({ userid: userId, postid: postId, status: 'published' })
+    body: JSON.stringify({ userid, postid: postId, status: 'published' })
   })
   if (!res.ok) throw new Error(`approvePost: ${res.status}`)
   return res.json()
@@ -57,11 +62,12 @@
  * 驳回
  * POST /areview
  */
-export async function rejectPost(postId, userId) {
+export async function rejectPost(postId) {
+  const userid = getAuthToken()
   const res = await fetch(`${BASE}/areview`, {
     method: 'POST',
     headers: { 'Content-Type': 'application/json' },
-    body: JSON.stringify({ userid: userId, postid: postId, status: 'rejected' })
+    body: JSON.stringify({ userid, postid: postId, status: 'rejected' })
   })
   if (!res.ok) throw new Error(`rejectPost: ${res.status}`)
   return res.json()
@@ -74,11 +80,12 @@
  * @param {number|string} userId 平台管理员的用户 ID
  * @returns Promise<{id, title, content, status}>
  */
-export async function fetchPost(postId, userId) {
+export async function fetchPost(postId) {
+  const userid = getAuthToken()
   const res = await fetch(`${BASE}/agetpost`, {
     method: 'POST',
     headers: { 'Content-Type': 'application/json' },
-    body: JSON.stringify({ userid: userId, postid: postId })
+    body: JSON.stringify({ userid, postid: postId })
   })
   if (!res.ok) throw new Error(`fetchPost: ${res.status}`)
   return res.json()
@@ -90,41 +97,45 @@
  * @param {number|string} userId 平台管理员的用户 ID
  * @returns Promise<[ {id, name, role}, … ]>
  */
-export async function fetchUserList(userId) {
+export async function fetchUserList() {
+  const userid = getAuthToken()
   const res = await fetch(`${BASE}/sgetuserlist`, {
     method: 'POST',
     headers: { 'Content-Type': 'application/json' },
-    body: JSON.stringify({ userid: userId })
+    body: JSON.stringify({ userid })
   })
   if (!res.ok) throw new Error(`fetchUserList: ${res.status}`)
   return res.json()
 }
 
-export async function giveAdmin(userId, targetId) {
+export async function giveAdmin(targetId) {
+  const userid = getAuthToken()
   const res = await fetch(`${BASE}/sgiveadmin`, {
     method: 'POST',
     headers: { 'Content-Type': 'application/json' },
-    body: JSON.stringify({ userid: userId, targetid: targetId })
+    body: JSON.stringify({ userid, targetid: targetId })
   })
   if (!res.ok) throw new Error(`giveAdmin: ${res.status}`)
   return res.json()
 }
 
-export async function giveSuperAdmin(userId, targetId) {
+export async function giveSuperAdmin(targetId) {
+  const userid = getAuthToken()
   const res = await fetch(`${BASE}/sgivesuperadmin`, {
     method: 'POST',
     headers: { 'Content-Type': 'application/json' },
-    body: JSON.stringify({ userid: userId, targetid: targetId })
+    body: JSON.stringify({ userid, targetid: targetId })
   })
   if (!res.ok) throw new Error(`giveSuperAdmin: ${res.status}`)
   return res.json()
 }
 
-export async function giveUser(userId, targetId) {
+export async function giveUser(targetId) {
+  const userid = getAuthToken()
   const res = await fetch(`${BASE}/sgiveuser`, {
     method: 'POST',
     headers: { 'Content-Type': 'application/json' },
-    body: JSON.stringify({ userid: userId, targetid: targetId })
+    body: JSON.stringify({ userid, targetid: targetId })
   })
   if (!res.ok) throw new Error(`giveUser: ${res.status}`)
   return res.json()
@@ -133,14 +144,14 @@
 /**
  * 获取事务日志
  * POST /getrecordlog
- * @param {number|string} userId 平台管理员的用户 ID
  * @returns Promise<[ {id, user_id, type, content, ip, created_at}, … ]>
  */
-export async function fetchRecordLog(userId) {
+export async function fetchRecordLog() {
+  const userid = getAuthToken()
   const res = await fetch(`${BASE}/getrecordlog`, {
     method: 'POST',
     headers: { 'Content-Type': 'application/json' },
-    body: JSON.stringify({ userid: userId })
+    body: JSON.stringify({ userid })
   })
   if (!res.ok) throw new Error(`fetchRecordLog: ${res.status}`)
   const json = await res.json()
@@ -166,11 +177,12 @@
  * @param {number|string} userId 平台管理员的用户 ID
  * @returns Promise<[ {id, record_time, endpoint, elapsed_time, cpu_user, cpu_system, memory_rss}, … ]>
  */
-export async function fetchSysCost(userId) {
+export async function fetchSysCost() {
+  const userid = getAuthToken()
   const res = await fetch(`${BASE}/getsyscost`, {
     method: 'POST',
     headers: { 'Content-Type': 'application/json' },
-    body: JSON.stringify({ userid: userId })
+    body: JSON.stringify({ userid })
   })
   if (!res.ok) throw new Error(`fetchSysCost: ${res.status}`)
   const json = await res.json()
