Explorar el Código

✨ feat(deps): add vite-progress-tracking-plugin dependency

- 添加vite-progress-tracking-plugin@0.0.1以支持构建进度跟踪

♻️ refactor(mobile): replace antd message with react-toastify

- 在PublishJobForm.tsx中替换message.success为toast.success
- 在PublishKnowledgeForm.tsx中替换message.success为toast.success
- 在CompanyProfilePage.tsx中替换message.success为toast.success
- 在FontSettingsPage.tsx中移除App.useApp()和message依赖,使用toast.success
- 在MyFavoritesPage.tsx中移除App.useApp()和message依赖,使用toast.success
- 在MyPostsPage.tsx中移除App.useApp()和message依赖,使用toast.success
- 在ProfileEditPage.tsx中移除App.useApp()和message依赖,使用toast.success
- 在ProfilePage.tsx中移除App.useApp()和message依赖,使用toast.success
- 在PublishPage.tsx中替换message.success为toast.success
- 在SkillsPage.tsx中替换message.success为toast.success

🔧 chore(deps): remove unused zod dependency

- 从package.json中移除zod@^3.24.2依赖
yourname hace 7 meses
padre
commit
9ea5a2ce3a

+ 2 - 1
package.json

@@ -56,6 +56,7 @@
     "node-cron": "^4.1.0",
     "tailwindcss": "^4.1.3",
     "typescript": "^5.8.3",
-    "vite": "^6.3.5"
+    "vite": "^6.3.5",
+    "vite-progress-tracking-plugin": "^0.0.1"
   }
 }

+ 12 - 3
pnpm-lock.yaml

@@ -116,9 +116,6 @@ importers:
       uuid:
         specifier: ^11.1.0
         version: 11.1.0
-      zod:
-        specifier: ^3.24.2
-        version: 3.24.2
     devDependencies:
       '@types/debug':
         specifier: ^4.1.12
@@ -153,6 +150,9 @@ importers:
       vite:
         specifier: ^6.3.5
         version: 6.3.5(@types/node@22.15.31)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)
+      vite-progress-tracking-plugin:
+        specifier: ^0.0.1
+        version: 0.0.1(vite@6.3.5(@types/node@22.15.31)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0))
 
 packages:
 
@@ -2790,6 +2790,11 @@ packages:
     resolution: {integrity: sha512-KhuXZxYXSlzEo6S3leOj806RI6XGdspDYPwqUYFGJajlsB4MffQ5My6rW+YO9uYkc2eM2Q+7OcCUnPrHaa3Upw==}
     engines: {node: '>=18.0.0'}
 
+  vite-progress-tracking-plugin@0.0.1:
+    resolution: {integrity: sha512-yZMAFtzgUOaJdqaxPiX+cY4jEhIqk24HYch8rTk9mIY3tc2IuiW+f09NFYftQFMxAKGeW1Wo1BvKJLEaTihNwQ==}
+    peerDependencies:
+      vite: ^3.0.0 || ^4.0.0 || ^5.0.0
+
   vite@6.3.5:
     resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==}
     engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
@@ -5484,6 +5489,10 @@ snapshots:
     dependencies:
       picomatch: 4.0.2
 
+  vite-progress-tracking-plugin@0.0.1(vite@6.3.5(@types/node@22.15.31)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)):
+    dependencies:
+      vite: 6.3.5(@types/node@22.15.31)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)
+
   vite@6.3.5(@types/node@22.15.31)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0):
     dependencies:
       esbuild: 0.25.5

+ 2 - 2
src/client/mobile/components/PublishJobForm.tsx

@@ -1,6 +1,6 @@
 import React, { useState, useEffect, useCallback } from 'react';
 import { useNavigate } from 'react-router-dom';
-import { message } from 'antd';
+import { toast } from 'react-toastify';
 import dayjs from 'dayjs';
 import { BriefcaseIcon, MapPinIcon, ClockIcon, CurrencyDollarIcon, AcademicCapIcon, CalendarIcon } from '@heroicons/react/24/outline';
 import { useAuth } from '@/client/mobile/hooks/AuthProvider';
@@ -243,7 +243,7 @@ export const PublishJobForm: React.FC<PublishJobFormProps> = ({ onSuccess, onCan
       });
 
       if (response.status === 201) {
-        message.success('岗位发布成功!');
+        toast.success('岗位发布成功!');
         onSuccess?.();
         // 重置表单
         setFormData({

+ 1 - 1
src/client/mobile/components/PublishKnowledgeForm.tsx

@@ -74,7 +74,7 @@ const PublishKnowledgeForm: React.FC<PublishKnowledgeFormProps> = ({ onSuccess,
       const result = await response.json();
       
       if (response.ok) {
-        message.success('智库发布成功!');
+        toast.success('智库发布成功!');
         form.resetFields();
         onSuccess();
       } else {

+ 3 - 2
src/client/mobile/pages/CompanyProfilePage.tsx

@@ -1,8 +1,9 @@
 import React, { useState, useEffect } from 'react';
 import { useNavigate } from 'react-router-dom';
 import { useAuth } from '../hooks/AuthProvider';
-import { Button, Card, Form, Input, Select, message, Space, Statistic, Row, Col, Badge, Divider } from 'antd';
+import { Button, Card, Form, Input, Select, Space, Statistic, Row, Col, Badge, Divider } from 'antd';
 import { EditOutlined, SaveOutlined, CloseOutlined, EnvironmentOutlined, PhoneOutlined, UserOutlined, SafetyCertificateOutlined, EyeOutlined, HeartOutlined } from '@ant-design/icons';
+import { toast } from 'react-toastify';
 
 const { TextArea } = Input;
 const { Option } = Select;
@@ -101,7 +102,7 @@ const CompanyProfilePage: React.FC = () => {
         setCompanyData(data);
         form.setFieldsValue(data);
         setIsEditing(false);
-        message.success('企业信息保存成功');
+        toast.success('企业信息保存成功');
       } else {
         toast.error('保存失败,请重试');
       }

+ 3 - 3
src/client/mobile/pages/FontSettingsPage.tsx

@@ -3,8 +3,9 @@ import { useAuth } from '../hooks/AuthProvider';
 import { useNavigate } from 'react-router-dom';
 import { userPreferenceClient } from '@/client/api';
 import { FontSizeType } from '@/server/modules/silver-users/user-preference.entity';
-import { App, Card, Button } from 'antd';
+import { Card, Button } from 'antd';
 import { ArrowLeftIcon } from '@heroicons/react/24/outline';
+import { toast } from 'react-toastify';
 
 const fontSizeOptions = [
   { value: FontSizeType.SMALL, label: '小', description: '14px - 适合视力较好的用户' },
@@ -16,7 +17,6 @@ const fontSizeOptions = [
 const FontSettingsPage: React.FC = () => {
   const { user } = useAuth();
   const navigate = useNavigate();
-  const { message } = App.useApp();
   const [fontSize, setFontSize] = useState<FontSizeType>(FontSizeType.MEDIUM);
   const [loading, setLoading] = useState(false);
   const [preferenceId, setPreferenceId] = useState<number | null>(null);
@@ -76,7 +76,7 @@ const FontSettingsPage: React.FC = () => {
         const data = await response.json();
         setFontSize(size);
         setPreferenceId(data.id);
-        message.success('字体大小设置已更新');
+        toast.success('字体大小设置已更新');
         updateDocumentFontSize(size);
       }
     } catch (error) {

+ 3 - 3
src/client/mobile/pages/MyFavoritesPage.tsx

@@ -2,16 +2,16 @@ import React, { useState, useEffect } from 'react';
 import { useAuth } from '../hooks/AuthProvider';
 import { useNavigate } from 'react-router-dom';
 import { silverUsersClient } from '@/client/api';
-import { App, Card, List, Button, Empty, Tabs, Tag } from 'antd';
+import { Card, List, Button, Empty, Tabs, Tag } from 'antd';
 import { EyeOutlined, HeartOutlined, PhoneOutlined } from '@ant-design/icons';
 import dayjs from 'dayjs';
+import { toast } from 'react-toastify';
 
 const { TabPane } = Tabs;
 
 const MyFavoritesPage: React.FC = () => {
   const { user } = useAuth();
   const navigate = useNavigate();
-  const { message } = App.useApp();
   const [loading, setLoading] = useState(false);
   const [activeTab, setActiveTab] = useState('knowledge');
   const [favoriteKnowledges, setFavoriteKnowledges] = useState<any[]>([]);
@@ -79,7 +79,7 @@ const MyFavoritesPage: React.FC = () => {
       }
 
       if (response.status === 200) {
-        message.success('取消收藏成功');
+        toast.success('取消收藏成功');
         loadFavorites();
       }
     } catch (error) {

+ 3 - 3
src/client/mobile/pages/MyPostsPage.tsx

@@ -2,9 +2,10 @@ import React, { useState, useEffect } from 'react';
 import { useAuth } from '../hooks/AuthProvider';
 import { useNavigate } from 'react-router-dom';
 import { silverUsersClient } from '@/client/api';
-import { App, Card, List, Tag, Button, Empty, Tabs, Avatar } from 'antd';
+import { Card, List, Tag, Button, Empty, Tabs, Avatar } from 'antd';
 import { EyeOutlined, LikeOutlined, MessageOutlined, DeleteOutlined } from '@ant-design/icons';
 import dayjs from 'dayjs';
+import { toast } from 'react-toastify';
 
 const { TabPane } = Tabs;
 
@@ -24,7 +25,6 @@ interface PostItem {
 const MyPostsPage: React.FC = () => {
   const { user } = useAuth();
   const navigate = useNavigate();
-  const { message } = App.useApp();
   const [loading, setLoading] = useState(false);
   const [activeTab, setActiveTab] = useState('knowledge');
   const [knowledgePosts, setKnowledgePosts] = useState<PostItem[]>([]);
@@ -92,7 +92,7 @@ const MyPostsPage: React.FC = () => {
       }
 
       if (response.status === 200) {
-        message.success('删除成功');
+        toast.success('删除成功');
         loadPosts();
       }
     } catch (error) {

+ 3 - 3
src/client/mobile/pages/ProfileEditPage.tsx

@@ -2,17 +2,17 @@ import React, { useState, useEffect } from 'react';
 import { useAuth } from '../hooks/AuthProvider';
 import { useNavigate } from 'react-router-dom';
 import { silverUsersClient, userClient } from '@/client/api';
-import { App, Form, Input, Button, DatePicker, Select, Upload } from 'antd';
+import { Form, Input, Button, DatePicker, Select, Upload } from 'antd';
 import { UploadOutlined } from '@ant-design/icons';
 import dayjs from 'dayjs';
 import type { UploadProps } from 'antd';
+import { toast } from 'react-toastify';
 
 const { Option } = Select;
 
 const ProfileEditPage: React.FC = () => {
   const { user } = useAuth();
   const navigate = useNavigate();
-  const { message } = App.useApp();
   const [form] = Form.useForm();
   const [loading, setLoading] = useState(false);
   const [profile, setProfile] = useState<any>(null);
@@ -118,7 +118,7 @@ const ProfileEditPage: React.FC = () => {
         }
 
         if (response.status === 200) {
-          message.success('个人信息更新成功');
+          toast.success('个人信息更新成功');
           navigate('/profile');
         }
       }

+ 3 - 3
src/client/mobile/pages/ProfilePage.tsx

@@ -3,9 +3,10 @@ import { useAuth } from '../hooks/AuthProvider';
 import { useNavigate } from 'react-router-dom';
 import { userPreferenceClient } from '@/client/api';
 import { FontSizeType } from '@/server/modules/silver-users/user-preference.entity';
-import { App, Card, Button } from 'antd';
+import { Card, Button } from 'antd';
 import { useHomeData } from '../hooks/useHomeData';
 import { UserStatsCard } from '../components/UserStatsCard';
+import { toast } from 'react-toastify';
 
 const fontSizeOptions = [
   { value: FontSizeType.SMALL, label: '小' },
@@ -17,7 +18,6 @@ const fontSizeOptions = [
 const ProfilePage: React.FC = () => {
   const { user, logout } = useAuth();
   const navigate = useNavigate();
-  const { message } = App.useApp();
   const [fontSize, setFontSize] = useState<FontSizeType>(FontSizeType.MEDIUM);
   const [loading, setLoading] = useState(false);
   const [preferenceId, setPreferenceId] = useState<number | null>(null);
@@ -79,7 +79,7 @@ const ProfilePage: React.FC = () => {
         const data = await response.json();
         setFontSize(size);
         setPreferenceId(data.id);
-        message.success('字体大小设置已更新');
+        toast.success('字体大小设置已更新');
         updateDocumentFontSize(size);
       }
     } catch (error) {

+ 2 - 2
src/client/mobile/pages/PublishPage.tsx

@@ -3,7 +3,7 @@ import { PublishJobForm } from '@/client/mobile/components/PublishJobForm';
 import PublishTalentForm from '@/client/mobile/components/PublishTalentForm';
 import PublishKnowledgeForm from '@/client/mobile/components/PublishKnowledgeForm';
 import { UserIcon, BriefcaseIcon, BookOpenIcon } from '@heroicons/react/24/outline';
-import { message } from 'antd';
+import { toast } from 'react-toastify';
 
 const INK_COLORS = {
   ink: {
@@ -36,7 +36,7 @@ const PublishPage: React.FC = () => {
   const [activeTab, setActiveTab] = useState<'job' | 'talent' | 'knowledge'>('job');
 
   const handleFormSuccess = () => {
-    message.success('发布成功!');
+    toast.success('发布成功!');
   };
 
   const handleFormCancel = () => {

+ 3 - 3
src/client/mobile/pages/SkillsPage.tsx

@@ -2,7 +2,7 @@ import React, { useState, useEffect } from 'react';
 import { useAuth } from '../hooks/AuthProvider';
 import { useNavigate } from 'react-router-dom';
 import { silverUsersClient } from '@/client/api';
-import { App, Card, List, Button, Tag, Modal, Form, Input, Select, Upload } from 'antd';
+import { Card, List, Button, Tag, Modal, Form, Input, Select, Upload } from 'antd';
 import { PlusOutlined, UploadOutlined, EditOutlined, DeleteOutlined } from '@ant-design/icons';
 import { toast } from 'react-toastify';
 import type { UploadProps } from 'antd';
@@ -77,7 +77,7 @@ const SkillsPage: React.FC = () => {
       const newCertificates = [...certificates, values];
       await updateProfile({ certificates: newCertificates });
       setCertificates(newCertificates);
-      message.success('证书添加成功');
+      toast.success('证书添加成功');
     } catch (error) {
       toast.error('证书添加失败');
     }
@@ -88,7 +88,7 @@ const SkillsPage: React.FC = () => {
       const newCertificates = certificates.filter((_, i) => i !== index);
       await updateProfile({ certificates: newCertificates });
       setCertificates(newCertificates);
-      message.success('证书删除成功');
+      toast.success('证书删除成功');
     } catch (error) {
       toast.error('证书删除失败');
     }