图片上传

This commit is contained in:
fengjignqi
2026-06-29 17:59:39 +08:00
parent f53408654b
commit b5e9f0de3b
21 changed files with 153 additions and 82 deletions

View File

@@ -5,7 +5,7 @@ import android.view.View;
import com.ckkj.water.R;
import com.ckkj.water.base.BaseActivity;
import com.ckkj.water.base.entity.MineUserInfoBean;
import com.ckkj.water.mine.entity.MineUserInfoBean;
import com.ckkj.water.databinding.AppThemeChangeLayoutBinding;
import com.ckkj.water.mine.mvp.MineContract;
import com.ckkj.water.mine.mvp.MineImpl;
@@ -124,7 +124,7 @@ public class AppThemActivity extends BaseActivity<AppThemeChangeLayoutBinding, M
}
@Override
public void uploadImageSuccess(BaseBean bean) {
public void uploadImageSuccess(MineUserInfoBean bean) {
}
}

View File

@@ -5,7 +5,7 @@ import android.os.CountDownTimer;
import android.text.TextUtils;
import android.view.View;
import com.ckkj.water.base.entity.MineUserInfoBean;
import com.ckkj.water.mine.entity.MineUserInfoBean;
import com.gyf.immersionbar.ImmersionBar;
import com.ckkj.water.R;
import com.ckkj.water.base.BaseActivity;
@@ -14,7 +14,6 @@ import com.ckkj.water.mine.mvp.MineContract;
import com.ckkj.water.mine.mvp.MineImpl;
import com.ckkj.water.mine.mvp.MinePresenter;
import com.ckkj.water.network.BaseBean;
import com.ckkj.water.utils.manager.WaterUserInfoManager;
import com.ckkj.water.utils.number.PhoneNumberUtils;
import com.ckkj.water.utils.show.ToastUtil;
@@ -153,7 +152,7 @@ public class ChangePhoneActivity extends BaseActivity<ChangePhoneActivityBinding
}
@Override
public void uploadImageSuccess(BaseBean bean) {
public void uploadImageSuccess(MineUserInfoBean bean) {
}
}

View File

@@ -2,7 +2,6 @@ package com.ckkj.water.mine;
import static android.view.View.INVISIBLE;
import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
@@ -11,12 +10,9 @@ import com.ckkj.water.AppConfig;
import com.ckkj.water.ConstantUtil;
import com.ckkj.water.R;
import com.ckkj.water.base.BaseFragment;
import com.ckkj.water.base.entity.MineUserInfoBean;
import com.ckkj.water.databinding.MineFragmentBinding;
import com.ckkj.water.mine.entity.MineUserInfoBean;
import com.ckkj.water.databinding.MineFragmentLayoutBinding;
import com.ckkj.water.login.LoginActivity;
import com.ckkj.water.main.entity.CheckVersionEntity;
import com.ckkj.water.mine.entity.MemberComboEntity;
import com.ckkj.water.mine.mvp.MineContract;
import com.ckkj.water.mine.mvp.MineImpl;
import com.ckkj.water.mine.mvp.MinePresenter;
@@ -26,16 +22,11 @@ import com.ckkj.water.utils.manager.ActivityManager;
import com.ckkj.water.utils.manager.LanguageManager;
import com.ckkj.water.utils.manager.ThemeManager;
import com.ckkj.water.utils.manager.WaterUserInfoManager;
import com.ckkj.water.utils.show.ToastUtil;
import com.google.gson.Gson;
import com.gyf.immersionbar.ImmersionBar;
import com.lxj.xpopup.XPopup;
import com.lxj.xpopup.interfaces.OnSelectListener;
import java.util.List;
import de.greenrobot.event.EventBus;
/**
* @author fengxiaoyang
* @date 2026/5/16
@@ -166,7 +157,7 @@ public class MineCenterFragment extends BaseFragment<MineFragmentLayoutBinding,
}
@Override
public void uploadImageSuccess(BaseBean bean) {
public void uploadImageSuccess(MineUserInfoBean bean) {
}

View File

@@ -13,15 +13,14 @@ import com.bumptech.glide.Glide;
import com.ckkj.water.ConstantUtil;
import com.ckkj.water.R;
import com.ckkj.water.base.BaseActivity;
import com.ckkj.water.base.entity.MineUserInfoBean;
import com.ckkj.water.mine.entity.MineUserInfoBean;
import com.ckkj.water.databinding.MineInformationLayoutBinding;
import com.ckkj.water.mine.mvp.MineContract;
import com.ckkj.water.mine.mvp.MineImpl;
import com.ckkj.water.mine.mvp.MinePresenter;
import com.ckkj.water.network.BaseBean;
import com.ckkj.water.utils.LubanCompressUtil;
import com.ckkj.water.utils.PreviewFileUtil;
import com.ckkj.water.utils.dataUtil.FileUtil;
import com.ckkj.water.utils.dataUtil.SharePreUtil;
import com.ckkj.water.utils.manager.ThemeManager;
import com.ckkj.water.utils.manager.WaterUserInfoManager;
import com.ckkj.water.utils.show.ToastUtil;
@@ -198,8 +197,32 @@ public class MineInfomationActivity extends BaseActivity<MineInformationLayoutBi
}
@Override
public void uploadImageSuccess(BaseBean bean) {
public void uploadImageSuccess(MineUserInfoBean bean) {
hideDialogLoading();
// 后端约定data 为上传后的头像访问URLString
String avatarUrl = bean.getUrl();
if (TextUtils.isEmpty(avatarUrl)) {
ToastUtil.showShort(mContext, getString(R.string.avatar_update_success));
return;
}
// 更新内存中的用户信息
if (mUserBean != null && mUserBean.getUser() != null) {
mUserBean.getUser().setAvatar(avatarUrl);
WaterUserInfoManager.getInstance().setUserInfo(mUserBean);
}
// 缓存头像地址到本地
SharePreUtil.putString(ConstantUtil.SHARE_PRE_NAME, mContext,
ConstantUtil.USER_INFO_AVATAR, avatarUrl);
// 刷新头像显示
Glide.with(mContext)
.load(avatarUrl)
.error(mContext.getDrawable(R.mipmap.icon_mine_user_head_defaul))
.into(viewBinding.imgAvatar);
ToastUtil.showShort(mContext, getString(R.string.avatar_update_success));
}
@@ -225,7 +248,7 @@ public class MineInfomationActivity extends BaseActivity<MineInformationLayoutBi
return;
}
//Todo 开始上传图片
// 上传图片
mPresenter.uploadImage(file);

View File

@@ -5,7 +5,7 @@ import android.view.View;
import com.ckkj.water.R;
import com.ckkj.water.base.BaseActivity;
import com.ckkj.water.base.entity.MineUserInfoBean;
import com.ckkj.water.mine.entity.MineUserInfoBean;
import com.ckkj.water.databinding.PasswordManLayoutBinding;
import com.ckkj.water.login.ForgetPasswordActivity;
import com.ckkj.water.mine.mvp.MineContract;
@@ -103,7 +103,7 @@ public class PsdManageActivity extends BaseActivity<PasswordManLayoutBinding, Mi
}
@Override
public void uploadImageSuccess(BaseBean bean) {
public void uploadImageSuccess(MineUserInfoBean bean) {
}
}

View File

@@ -6,7 +6,7 @@ import android.view.View;
import com.ckkj.water.R;
import com.ckkj.water.base.BaseActivity;
import com.ckkj.water.base.entity.MineUserInfoBean;
import com.ckkj.water.mine.entity.MineUserInfoBean;
import com.ckkj.water.databinding.ResetPsdLayoutBinding;
import com.ckkj.water.mine.mvp.MineContract;
import com.ckkj.water.mine.mvp.MineImpl;
@@ -97,7 +97,7 @@ public class ResetPsdActivity extends BaseActivity<ResetPsdLayoutBinding, MinePr
}
@Override
public void uploadImageSuccess(BaseBean bean) {
public void uploadImageSuccess(MineUserInfoBean bean) {
}

View File

@@ -6,7 +6,7 @@ import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import com.ckkj.water.base.entity.MineUserInfoBean;
import com.ckkj.water.mine.entity.MineUserInfoBean;
import com.gyf.immersionbar.ImmersionBar;
import com.ckkj.water.AppConfig;
import com.ckkj.water.EventMessage;
@@ -226,7 +226,7 @@ public class SettingsActivity extends BaseActivity<ActivitySettingsLayoutBinding
}
@Override
public void uploadImageSuccess(BaseBean bean) {
public void uploadImageSuccess(MineUserInfoBean bean) {
}
}

View File

@@ -5,7 +5,7 @@ import android.os.CountDownTimer;
import android.text.TextUtils;
import android.view.View;
import com.ckkj.water.base.entity.MineUserInfoBean;
import com.ckkj.water.mine.entity.MineUserInfoBean;
import com.gyf.immersionbar.ImmersionBar;
import com.ckkj.water.AppConfig;
import com.ckkj.water.R;
@@ -15,8 +15,6 @@ import com.ckkj.water.mine.mvp.MineContract;
import com.ckkj.water.mine.mvp.MineImpl;
import com.ckkj.water.mine.mvp.MinePresenter;
import com.ckkj.water.network.BaseBean;
import com.ckkj.water.utils.manager.WaterUserInfoManager;
import com.ckkj.water.utils.number.PhoneNumberUtils;
import com.ckkj.water.utils.show.ToastUtil;
@@ -133,7 +131,7 @@ public class UserLogOffAccountActivity extends BaseActivity<UserLogOffActivityBi
}
@Override
public void uploadImageSuccess(BaseBean bean) {
public void uploadImageSuccess(MineUserInfoBean bean) {
}
}

View File

@@ -0,0 +1,84 @@
package com.ckkj.water.mine.entity;
import java.io.Serializable;
import java.util.List;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author fengxiaoyang
* @date 2025/7/28
* @description TODO: 描述该类的作用
*/
@NoArgsConstructor
@Data
public class MineUserInfoBean implements Serializable {
/**
* user : {"userId":"2056543507514097665","tenantId":"000000","deptId":null,"userName":null,"nickName":"给个回话","userType":"app_user","email":"","phonenumber":"133****6054","sex":"0","avatar":null,"password":"$2a$10$KsCb1Z1znyQgL7W.GoljuuVPctzZ7tS7obu8W2WkK5ydsejQOjRi2","status":"0","loginIp":"192.168.1.7","loginDate":"2026-05-21 08:44:20","remark":null,"createTime":"2026-05-19 09:12:36","deptName":null,"roles":[],"roleIds":null,"postIds":null,"roleId":null,"oldPassword":null}
* permissions : []
* roles : []
*/
private UserBean user;
private List<?> permissions;
private List<?> roles;
private String url;
@NoArgsConstructor
@Data
public static class UserBean implements Serializable{
/**
* userId : 2056543507514097665
* tenantId : 000000
* deptId : null
* userName : null
* nickName : 给个回话
* userType : app_user
* email :
* phonenumber : 133****6054
* sex : 0
* avatar : null
* password : $2a$10$KsCb1Z1znyQgL7W.GoljuuVPctzZ7tS7obu8W2WkK5ydsejQOjRi2
* status : 0
* loginIp : 192.168.1.7
* loginDate : 2026-05-21 08:44:20
* remark : null
* createTime : 2026-05-19 09:12:36
* deptName : null
* roles : []
* roleIds : null
* postIds : null
* roleId : null
* oldPassword : null
*/
private String userId;
private String tenantId;
private Object deptId;
private Object userName;
private String nickName;
private String userType;
private String email;
private String phonenumber;
private String sex;
private Object avatar;
private String password;
private String status;
private String loginIp;
private String loginDate;
private Object remark;
private String createTime;
private Object deptName;
private Object roleIds;
private Object postIds;
private Object roleId;
private Object oldPassword;
private List<?> roles;
}
}

View File

@@ -1,18 +1,11 @@
package com.ckkj.water.mine.mvp;
import com.ckkj.water.base.IView;
import com.ckkj.water.base.entity.MineUserInfoBean;
import com.ckkj.water.login.mvp.LoginContract;
import com.ckkj.water.main.entity.CheckVersionEntity;
import com.ckkj.water.mine.entity.InviteeRecordEntity;
import com.ckkj.water.mine.entity.MemberComboEntity;
import com.ckkj.water.mine.entity.RecommendDataEntity;
import com.ckkj.water.mine.entity.RewardRecordEntity;
import com.ckkj.water.mine.entity.MineUserInfoBean;
import com.ckkj.water.network.BaseBean;
import org.json.JSONObject;
import java.util.List;
import java.util.Map;
/**
@@ -50,7 +43,7 @@ public class MineContract {
//退出登录
void logOutSuccess(BaseBean bean);
//上传图片成功
void uploadImageSuccess(BaseBean bean);
void uploadImageSuccess(MineUserInfoBean bean);
}

View File

@@ -1,15 +1,12 @@
package com.ckkj.water.mine.mvp;
import com.ckkj.water.base.entity.MineUserInfoBean;
import com.ckkj.water.login.mvp.LoginContract;
import com.ckkj.water.mine.entity.MemberComboEntity;
import com.ckkj.water.mine.entity.MineUserInfoBean;
import com.ckkj.water.network.BaseBean;
import com.ckkj.water.network.LoginStateManager;
import com.ckkj.water.network.NetWorkManager;
import org.json.JSONObject;
import java.util.List;
import java.io.File;
import java.util.Map;
import io.reactivex.Observer;
@@ -17,6 +14,9 @@ import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.annotations.NonNull;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;
/**
* @author fengxiaoyang
@@ -143,11 +143,73 @@ public class MineImpl implements MineContract.DataModel {
/**
* 上传图片
* @param json
* @param callBack
*
* @param json 预留参数,目前接口不需要,但保留扩展能力(例如上传类型/用户ID等
* @param callBack 上传结果回调
*/
@Override
public void uploadImage(JSONObject json, MineContract.CallBack callBack) {
File file = null;
if (json != null && json.has("file")) {
try {
String path = json.getString("file");
if (path != null && !path.isEmpty()) {
file = new File(path);
}
} catch (Exception e) {
e.printStackTrace();
}
}
if (file == null || !file.exists()) {
callBack.fail("文件不存在");
return;
}
// 推断 MIME 类型:根据后缀决定 image/jpeg 或 image/png其它统一用 image/jpeg
String fileName = file.getName().toLowerCase();
MediaType mediaType;
if (fileName.endsWith(".png")) {
mediaType = MediaType.parse("image/png");
} else if (fileName.endsWith(".jpg") || fileName.endsWith(".jpeg")) {
mediaType = MediaType.parse("image/jpeg");
} else {
mediaType = MediaType.parse("image/jpeg");
}
RequestBody requestBody = RequestBody.create(mediaType, file);
// 参数名固定为 "file",与后端约定一致
MultipartBody.Part part = MultipartBody.Part.createFormData("file", file.getName(), requestBody);
try {
NetWorkManager.getRequest().uploadImage(NetWorkManager.getToken(), part)
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<BaseBean<MineUserInfoBean>>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull BaseBean<MineUserInfoBean> bean) {
if (bean.getCode() == 200) {
callBack.success(bean.getData());
} else {
callBack.fail(bean.getMessage());
}
}
@Override
public void onError(@NonNull Throwable e) {
callBack.fail(e.getMessage());
}
@Override
public void onComplete() {
}
});
} catch (Exception e) {
e.printStackTrace();
callBack.fail(e.getMessage());
}
}
}

View File

@@ -1,18 +1,10 @@
package com.ckkj.water.mine.mvp;
import android.text.Editable;
import android.text.TextUtils;
import com.ckkj.water.ConstantUtil;
import com.ckkj.water.base.BasePresenter;
import com.ckkj.water.base.entity.MineUserInfoBean;
import com.ckkj.water.base.entity.UserInfoEntity;
import com.ckkj.water.mine.entity.MineUserInfoBean;
import com.ckkj.water.login.mvp.LoginContract;
import com.ckkj.water.login.mvp.LoginImpl;
import com.ckkj.water.network.BaseBean;
import com.ckkj.water.utils.dataUtil.SharePreUtil;
import com.ckkj.water.utils.manager.WaterUserInfoManager;
import com.google.gson.Gson;
import org.json.JSONException;
import org.json.JSONObject;
@@ -139,9 +131,32 @@ public class MinePresenter extends BasePresenter<MineContract.MineView> {
/**
* 上传图片
* @param file
* @param file 已压缩后的图片文件
*/
public void uploadImage(File file) {
try {
JSONObject json = new JSONObject();
json.put("file", file == null ? "" : file.getAbsolutePath());
impl.uploadImage(json, new MineContract.CallBack<MineUserInfoBean>() {
@Override
public void success(MineUserInfoBean bean) {
if (MinePresenter.this.getView() != null) {
MinePresenter.this.getView().uploadImageSuccess(bean);
}
}
@Override
public void fail(String msg) {
if (MinePresenter.this.getView() != null) {
MinePresenter.this.getView().showError(msg);
}
}
});
} catch (JSONException e) {
e.printStackTrace();
if (getView() != null) {
getView().showError(e.getMessage());
}
}
}
}