diff --git a/app/Http/Controllers/Api/System/File.php b/app/Http/Controllers/Api/System/File.php new file mode 100644 index 0000000..8b22aee --- /dev/null +++ b/app/Http/Controllers/Api/System/File.php @@ -0,0 +1,122 @@ + +// +---------------------------------------------------------------------- +namespace App\Http\Controllers\Api\System; + +use Illuminate\Http\Request; +use Illuminate\Support\Facades\Storage; +use App\Http\Controllers\BaseController; + +class File extends BaseController { + + /** + * @title 上传文件 + * + * @param Request $request + * @return void + */ + public function upload(Request $request){ + $type = $request->input('type', 'images'); + + try { + switch ($type) { + case 'avatar': + $this->data['data'] = $this->avatar($request); + break; + case 'images': + $this->data['data'] = $this->images($request); + break; + case 'files': + $this->data['data'] = $this->files($request); + break; + default: + $this->data['data'] = $this->images($request); + break; + } + } catch (\Throwable $th) { + $this->data['code'] = 0; + $this->data['message'] = $th->getMessage(); + } + return response()->json($this->data); + } + + /** + * @title 上传头像 + * + * @param Request $request + * @return void + */ + protected function avatar(Request $request){ + $file = $request->file('file'); + + if ($file->isValid()) { + $ext = $file->extension(); + $name = $file->hashName(); + + $path = $file->store('avatar/'.date('Ymd')); + + $data = [ + 'path' => $path, + 'url' => Storage::disk()->url($path), + 'src' => Storage::disk()->url($path), + 'name'=> $name, + 'size'=> $file->getSize(), + 'ext' => $ext, + ]; + return $data; + }else{ + throw new \Exception('上传失败'); + } + } + + protected function images(Request $request){ + $file = $request->file('file'); + + if ($file->isValid()) { + $ext = $file->extension(); + $name = $file->hashName(); + + $path = $file->store('images/'.date('Ymd')); + + $data = [ + 'path' => $path, + 'url' => Storage::disk()->url($path), + 'src' => Storage::disk()->url($path), + 'name'=> $name, + 'size'=> $file->getSize(), + 'ext' => $ext, + ]; + return $data; + }else{ + throw new \Exception('上传失败'); + } + } + + protected function files(Request $request){ + $file = $request->file('file'); + + if ($file->isValid()) { + $ext = $file->extension(); + $name = $file->hashName(); + + $path = $file->store('files/'.date('Ymd')); + + $data = [ + 'path' => $path, + 'url' => Storage::disk()->url($path), + 'src' => Storage::disk()->url($path), + 'name'=> $name, + 'size'=> $file->getSize(), + 'ext' => $ext, + ]; + return $data; + }else{ + throw new \Exception('上传失败'); + } + } +} diff --git a/modules/Member/app/Models/Member.php b/modules/Member/app/Models/Member.php index 5f2b916..3b1cd18 100644 --- a/modules/Member/app/Models/Member.php +++ b/modules/Member/app/Models/Member.php @@ -14,6 +14,8 @@ use Illuminate\Notifications\Notification; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Support\Facades\Hash; +use Illuminate\Support\Facades\Storage; +use Illuminate\Support\Str; class Member extends Authenticatable implements JWTSubject { use Notifiable; @@ -59,7 +61,9 @@ class Member extends Authenticatable implements JWTSubject { public function avatar(): Attribute { return new Attribute( - get: fn ($value) => $value ?? request()->root() . '/storage/avatar/default_avatar.jpg', + get: function($value){ + return $value ? (Str::startsWith($value, 'http') ? $value : Storage::url($value)) : ''; + } ); } diff --git a/resources/mobile/api/modules/common.js b/resources/mobile/api/modules/common.js index 45c9272..713d813 100644 --- a/resources/mobile/api/modules/common.js +++ b/resources/mobile/api/modules/common.js @@ -2,10 +2,13 @@ import request from '@/utils/request' export default { upload: { - url: '/api/system/upload', + url: '/api/system/file/upload', name: '图片上传', - post: async function(params) { - return request.post(this.url, params) + post: async function(file, params) { + return request.upload(this.url, { + filePath: file, + params + }) } } } diff --git a/resources/mobile/pages/account/bill/index.vue b/resources/mobile/pages/account/bill/index.vue index 13757f8..279b26d 100644 --- a/resources/mobile/pages/account/bill/index.vue +++ b/resources/mobile/pages/account/bill/index.vue @@ -144,7 +144,7 @@ export default { paymentMap: { '微信': { name: '微信', icon: 'weixin', color: '#07C160' }, '支付宝': { name: '支付宝', icon: 'redo', color: '#1677FF' }, - '银行卡': { name: '银行卡', icon: 'bankcard', color: '#FF6B6B' }, + '银行卡': { name: '银行卡', icon: 'camera', color: '#FF6B6B' }, '现金': { name: '现金', icon: 'wallet', color: '#FFA500' }, '其他': { name: '其他', icon: 'more', color: '#999999' } } diff --git a/resources/mobile/pages/ucenter/index/index.vue b/resources/mobile/pages/ucenter/index/index.vue index 60870c3..2006b0c 100644 --- a/resources/mobile/pages/ucenter/index/index.vue +++ b/resources/mobile/pages/ucenter/index/index.vue @@ -147,7 +147,7 @@ import { isLogin, logout } from '@/utils/auth.js' export default { data() { return { - userInfo: {}, + userInfo: this.$store.state.user.userInfo, isLogin: false, stats: { billCount: 0, diff --git a/resources/mobile/pages/ucenter/profile/edit.vue b/resources/mobile/pages/ucenter/profile/edit.vue index 9d24d67..c1add27 100644 --- a/resources/mobile/pages/ucenter/profile/edit.vue +++ b/resources/mobile/pages/ucenter/profile/edit.vue @@ -75,7 +75,7 @@ export default { async loadUserInfo() { try { // 从本地存储获取用户信息 - const userInfo = uni.getStorageSync('userInfo') || {} + const userInfo = this.$store.state.user.userInfo || {} this.formData = { username: userInfo.username || '', nickname: userInfo.nickname || '', @@ -113,47 +113,23 @@ export default { title: '上传中...' }) - // 调用上传接口 - uni.uploadFile({ - url: commonApi.upload.url, - filePath: filePath, - name: 'file', - header: { - 'Authorization': 'Bearer ' + uni.getStorageSync('token') - }, - success: (uploadRes) => { - uni.hideLoading() - try { - const data = JSON.parse(uploadRes.data) - if (data.code === 1) { - this.formData.avatar = data.data.url || data.data - uni.showToast({ - title: '上传成功', - icon: 'success' - }) - } else { - uni.showToast({ - title: data.message || '上传失败', - icon: 'none' - }) - } - } catch (e) { - console.error('解析上传结果失败:', e) - uni.showToast({ - title: '上传失败', - icon: 'none' - }) - } - }, - fail: (error) => { - uni.hideLoading() - console.error('上传失败:', error) - uni.showToast({ - title: '上传失败', - icon: 'none' - }) - } - }) + // 调用上传接口,传递 type=avatar 参数 + const result = await this.$api.common.upload.post(filePath, { type: 'avatar' }) + + uni.hideLoading() + + if (result && result.code === 1) { + this.formData.avatar = result.data.url || result.data + uni.showToast({ + title: '上传成功', + icon: 'success' + }) + } else { + uni.showToast({ + title: result?.message || '上传失败', + icon: 'none' + }) + } } catch (error) { uni.hideLoading() console.error('上传头像失败:', error) @@ -192,7 +168,7 @@ export default { }) // 调用更新用户信息接口 - const result = await memberApi.edit.put({ + const result = await this.$api.member.edit.post({ nickname: this.formData.nickname, email: this.formData.email, avatar: this.formData.avatar @@ -268,12 +244,6 @@ export default {