feat(ui): replace emoji icons with fontawesome icons

Add Font Awesome dependency and replace all emoji icons with corresponding Font Awesome icons across components. This provides better visual consistency and scalability.
This commit is contained in:
2026-03-09 22:16:55 +08:00
parent 2f6cfe7704
commit b4c8b21142
8 changed files with 31 additions and 16 deletions

10
package-lock.json generated
View File

@@ -8,6 +8,7 @@
"name": "super-frpc-frontend", "name": "super-frpc-frontend",
"version": "0.0.1", "version": "0.0.1",
"dependencies": { "dependencies": {
"@fortawesome/fontawesome-free": "^7.2.0",
"axios": "^1.6.0", "axios": "^1.6.0",
"chart.js": "^4.4.0", "chart.js": "^4.4.0",
"vue": "^3.4.0", "vue": "^3.4.0",
@@ -456,6 +457,15 @@
"node": ">=12" "node": ">=12"
} }
}, },
"node_modules/@fortawesome/fontawesome-free": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-7.2.0.tgz",
"integrity": "sha512-3DguDv/oUE+7vjMeTSOjCSG+KeawgVQOHrKRnvUuqYh1mfArrh7s+s8hXW3e4RerBA1+Wh+hBqf8sJNpqNrBWg==",
"license": "(CC-BY-4.0 AND OFL-1.1 AND MIT)",
"engines": {
"node": ">=6"
}
},
"node_modules/@jridgewell/sourcemap-codec": { "node_modules/@jridgewell/sourcemap-codec": {
"version": "1.5.5", "version": "1.5.5",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",

View File

@@ -9,6 +9,7 @@
"preview": "vite preview" "preview": "vite preview"
}, },
"dependencies": { "dependencies": {
"@fortawesome/fontawesome-free": "^7.2.0",
"axios": "^1.6.0", "axios": "^1.6.0",
"chart.js": "^4.4.0", "chart.js": "^4.4.0",
"vue": "^3.4.0", "vue": "^3.4.0",

View File

@@ -8,13 +8,13 @@
class="menu-item" class="menu-item"
active-class="active" active-class="active"
> >
<span class="menu-icon">{{ item.icon }}</span> <i :class="item.icon" class="menu-icon" aria-hidden="true"></i>
<span class="menu-text">{{ item.title }}</span> <span class="menu-text">{{ item.title }}</span>
</router-link> </router-link>
</div> </div>
<div class="theme-toggle"> <div class="theme-toggle">
<button @click="toggleTheme" class="theme-button"> <button @click="toggleTheme" class="theme-button">
<span class="theme-icon">{{ isDarkMode ? '☀️' : '🌙' }}</span> <span class="theme-icon"><i :class="isDarkMode ? 'fas fa-sun' : 'fas fa-moon'" aria-hidden="true"></i></span>
<span class="theme-text">{{ isDarkMode ? 'Dark Mode' : 'Light Mode' }}</span> <span class="theme-text">{{ isDarkMode ? 'Dark Mode' : 'Light Mode' }}</span>
</button> </button>
</div> </div>
@@ -33,12 +33,12 @@ export default {
const toggleTheme = inject('toggleTheme'); const toggleTheme = inject('toggleTheme');
const allMenuItems = [ const allMenuItems = [
{ path: '/instances', title: 'Instance Management', icon: '📦', permission: ['superuser', 'admin', 'visitor'] }, { path: '/instances', title: 'Instance Management', icon: 'fas fa-box', permission: ['superuser', 'admin', 'visitor'] },
{ path: '/users', title: 'User Management', icon: '👥', permission: ['superuser'] }, { path: '/users', title: 'User Management', icon: 'fas fa-users', permission: ['superuser'] },
{ path: '/sessions', title: 'Session Management', icon: '🔑', permission: ['superuser', 'admin'] }, { path: '/sessions', title: 'Session Management', icon: 'fas fa-key', permission: ['superuser', 'admin'] },
{ path: '/logs', title: 'System Logs', icon: '📋', permission: ['superuser', 'admin'] }, { path: '/logs', title: 'System Logs', icon: 'fas fa-file-alt', permission: ['superuser', 'admin'] },
{ path: '/monitor', title: 'System Monitoring', icon: '📊', permission: ['superuser', 'admin', 'visitor'] }, { path: '/monitor', title: 'System Monitoring', icon: 'fas fa-chart-bar', permission: ['superuser', 'admin', 'visitor'] },
{ path: '/system-info', title: 'System Information', icon: '', permission: ['superuser', 'admin', 'visitor'] } { path: '/system-info', title: 'System Information', icon: 'fas fa-info-circle', permission: ['superuser', 'admin', 'visitor'] }
]; ];
const menuItems = computed(() => { const menuItems = computed(() => {

View File

@@ -11,7 +11,7 @@
placeholder="Search Instances..." placeholder="Search Instances..."
@input="handleSearch" @input="handleSearch"
> >
<span class="search-icon">🔍</span> <i class="fas fa-search search-icon" aria-hidden="true"></i>
</div> </div>
</div> </div>
<div class="topbar-right"> <div class="topbar-right">

View File

@@ -1,6 +1,7 @@
import { createApp } from 'vue'; import { createApp } from 'vue';
import App from './App.vue'; import App from './App.vue';
import router from './router/index.js'; import router from './router/index.js';
import '@fortawesome/fontawesome-free/css/all.css';
const app = createApp(App); const app = createApp(App);
app.use(router); app.use(router);

View File

@@ -2,6 +2,9 @@
<div class="instances-page"> <div class="instances-page">
<div class="page-header"> <div class="page-header">
<h2>Instance Management</h2> <h2>Instance Management</h2>
<button class="add-btn" @click="showAddModal = true">
<i class="fas fa-plus" aria-hidden="true"></i> Add Instance
</button>
</div> </div>
<div class="instances-grid"> <div class="instances-grid">
<div <div

View File

@@ -6,7 +6,7 @@
<div class="sessions-grid"> <div class="sessions-grid">
<div v-for="session in sessions" :key="session.ID" class="session-card"> <div v-for="session in sessions" :key="session.ID" class="session-card">
<div class="card-header"> <div class="card-header">
<div class="session-icon">🔑</div> <div class="session-icon"><i class="fas fa-key" aria-hidden="true"></i></div>
<div class="session-info"> <div class="session-info">
<div class="session-user">{{ session.username }}</div> <div class="session-user">{{ session.username }}</div>
<div class="session-id">{{ session.ID }}</div> <div class="session-id">{{ session.ID }}</div>

View File

@@ -6,7 +6,7 @@
<div class="info-grid"> <div class="info-grid">
<div class="info-card"> <div class="info-card">
<div class="card-header"> <div class="card-header">
<span class="card-icon">💻</span> <span class="card-icon"><i class="fas fa-laptop" aria-hidden="true"></i></span>
<h3>Operating System</h3> <h3>Operating System</h3>
</div> </div>
<div class="card-body"> <div class="card-body">
@@ -27,7 +27,7 @@
<div class="info-card"> <div class="info-card">
<div class="card-header"> <div class="card-header">
<span class="card-icon">🔧</span> <span class="card-icon"><i class="fas fa-tools" aria-hidden="true"></i></span>
<h3>Processor</h3> <h3>Processor</h3>
</div> </div>
<div class="card-body"> <div class="card-body">
@@ -48,7 +48,7 @@
<div class="info-card"> <div class="info-card">
<div class="card-header"> <div class="card-header">
<span class="card-icon">💾</span> <span class="card-icon"><i class="fas fa-memory" aria-hidden="true"></i></span>
<h3>Memory</h3> <h3>Memory</h3>
</div> </div>
<div class="card-body"> <div class="card-body">
@@ -69,7 +69,7 @@
<div class="info-card"> <div class="info-card">
<div class="card-header"> <div class="card-header">
<span class="card-icon">💿</span> <span class="card-icon"><i class="fas fa-hdd" aria-hidden="true"></i></span>
<h3>Disk</h3> <h3>Disk</h3>
</div> </div>
<div class="card-body"> <div class="card-body">
@@ -90,7 +90,7 @@
<div class="info-card"> <div class="info-card">
<div class="card-header"> <div class="card-header">
<span class="card-icon">🌐</span> <span class="card-icon"><i class="fas fa-globe" aria-hidden="true"></i></span>
<h3>Network</h3> <h3>Network</h3>
</div> </div>
<div class="card-body"> <div class="card-body">
@@ -111,7 +111,7 @@
<div class="info-card"> <div class="info-card">
<div class="card-header"> <div class="card-header">
<span class="card-icon"></span> <span class="card-icon"><i class="fas fa-clock" aria-hidden="true"></i></span>
<h3>Uptime</h3> <h3>Uptime</h3>
</div> </div>
<div class="card-body"> <div class="card-body">