+
@@ -58,11 +64,12 @@ import { API_BASE_URL, toast } from '../main'
import { getToken, fetchCurrentUser, setToken } from '../utils/auth'
import BaseInput from '../components/BaseInput.vue'
import Dropdown from '../components/Dropdown.vue'
+import AvatarCropper from '../components/AvatarCropper.vue'
import { hatch } from 'ldrs'
hatch.register()
export default {
name: 'SettingsPageView',
- components: { BaseInput, Dropdown },
+ components: { BaseInput, Dropdown, AvatarCropper },
data() {
return {
username: '',
@@ -70,6 +77,8 @@ export default {
usernameError: '',
avatar: '',
avatarFile: null,
+ tempAvatar: '',
+ showCropper: false,
role: '',
publishMode: 'DIRECT',
passwordStrength: 'LOW',
@@ -100,15 +109,19 @@ export default {
methods: {
onAvatarChange(e) {
const file = e.target.files[0]
- this.avatarFile = file
if (file) {
const reader = new FileReader()
reader.onload = () => {
- this.avatar = reader.result
+ this.tempAvatar = reader.result
+ this.showCropper = true
}
reader.readAsDataURL(file)
}
},
+ onCropped({ file, url }) {
+ this.avatarFile = file
+ this.avatar = url
+ },
fetchPublishModes() {
return Promise.resolve([
{ id: 'DIRECT', name: '直接发布', icon: 'fas fa-bolt' },
From 9f1080eeb012483c9a0b16034861897b515ac4d6 Mon Sep 17 00:00:00 2001
From: Tim
Date: Mon, 4 Aug 2025 13:11:55 +0800
Subject: [PATCH 2/2] feat: cropper
---
frontend/src/components/AvatarCropper.vue | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/frontend/src/components/AvatarCropper.vue b/frontend/src/components/AvatarCropper.vue
index 96755cd5f..2cb0a1d62 100644
--- a/frontend/src/components/AvatarCropper.vue
+++ b/frontend/src/components/AvatarCropper.vue
@@ -83,7 +83,8 @@ export default {
left: 0;
right: 0;
bottom: 0;
- background: rgba(0, 0, 0, 0.8);
+ background-color: rgba(0, 0, 0, 0.8);
+ opacity: 1.0;
display: flex;
align-items: center;
justify-content: center;
@@ -91,7 +92,7 @@ export default {
}
.cropper-body {
- background: #fff;
+ background: var(--background-color);
padding: 10px;
border-radius: 6px;
display: flex;
@@ -118,15 +119,16 @@ export default {
.cropper-btn {
padding: 6px 12px;
- border: 1px solid #ccc;
- background: #fff;
border-radius: 4px;
+ color: var(--primary-color);
+ border: none;
+ background: transparent;
cursor: pointer;
}
.cropper-btn.primary {
background: var(--primary-color);
- color: #fff;
+ color: var(--text-color);
border-color: var(--primary-color);
}