|
|
|
@ -35,23 +35,41 @@ import com.tamguo.util.ShiroUtils;
|
|
|
|
|
import com.tamguo.util.Status;
|
|
|
|
|
import com.tamguo.util.UploaderMessage;
|
|
|
|
|
|
|
|
|
|
// 标识这是一个Spring的控制器类,用于处理Web请求并返回相应的视图或数据
|
|
|
|
|
@Controller
|
|
|
|
|
public class AccountController {
|
|
|
|
|
|
|
|
|
|
// 自动注入IMemberService,用于处理会员相关的业务逻辑
|
|
|
|
|
@Autowired
|
|
|
|
|
public IMemberService memberService;
|
|
|
|
|
|
|
|
|
|
// 通过配置文件注入文件存储路径属性值,方便后续文件保存操作使用
|
|
|
|
|
@Value("${file.storage.path}")
|
|
|
|
|
private String fileStoragePath;
|
|
|
|
|
|
|
|
|
|
// 自动注入Setting,可能用于获取一些系统配置相关的设置信息
|
|
|
|
|
@Autowired
|
|
|
|
|
private Setting setting;
|
|
|
|
|
|
|
|
|
|
// 自动注入CacheService,用于缓存相关操作,例如在生成头像编号时使用缓存来保证编号的唯一性和递增性
|
|
|
|
|
@Autowired
|
|
|
|
|
private CacheService cacheService;
|
|
|
|
|
|
|
|
|
|
// 定义头像编号的默认格式化字符串,用于格式化生成的编号,保证编号格式统一
|
|
|
|
|
private static final String AVATOR_NO_FORMAT = "00000";
|
|
|
|
|
// 定义头像编号的前缀,方便识别头像文件相关的编号
|
|
|
|
|
private static final String AVATOR_PREFIX = "MTX";
|
|
|
|
|
|
|
|
|
|
// 创建日志记录器,用于记录该类中关键操作的日志信息,方便调试和问题排查
|
|
|
|
|
public Logger logger = LoggerFactory.getLogger(getClass());
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 处理会员账户页面的GET请求,设置视图名称并从会话中获取当前会员信息,再通过会员服务查询更详细的会员信息后添加到模型中返回视图
|
|
|
|
|
*
|
|
|
|
|
* @param model 用于传递数据到视图的ModelAndView对象
|
|
|
|
|
* @param session 当前的HttpSession对象,可从中获取会话相关的属性,如当前会员信息
|
|
|
|
|
* @return 返回包含视图名称和会员相关数据的ModelAndView对象,以便渲染相应的视图展示给用户
|
|
|
|
|
*/
|
|
|
|
|
@RequestMapping(value = "member/account", method = RequestMethod.GET)
|
|
|
|
|
public ModelAndView index(ModelAndView model, HttpSession session) {
|
|
|
|
|
model.setViewName("member/account");
|
|
|
|
@ -60,6 +78,12 @@ public class AccountController {
|
|
|
|
|
return model;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 处理会员信息更新的POST请求,设置会员的用户ID(可能从安全框架获取当前登录用户ID),然后调用会员服务更新会员信息,并返回更新成功的结果
|
|
|
|
|
*
|
|
|
|
|
* @param member 包含要更新的会员信息的MemberEntity对象,通过请求体接收
|
|
|
|
|
* @return 返回表示更新操作结果的Result对象,如果更新成功则包含更新后的会员信息
|
|
|
|
|
*/
|
|
|
|
|
@RequestMapping(value = "member/account/update", method = RequestMethod.POST)
|
|
|
|
|
@ResponseBody
|
|
|
|
|
public Result updateMember(@RequestBody MemberEntity member) {
|
|
|
|
@ -68,43 +92,76 @@ public class AccountController {
|
|
|
|
|
return Result.successResult(member);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 处理会员密码页面的GET请求,仅设置视图名称,用于返回相应的密码修改页面视图给用户
|
|
|
|
|
*
|
|
|
|
|
* @param model 用于传递数据到视图的ModelAndView对象(此处未添加额外数据)
|
|
|
|
|
* @return 返回包含视图名称的ModelAndView对象,以便渲染密码修改页面视图
|
|
|
|
|
*/
|
|
|
|
|
@RequestMapping(value = "member/password", method = RequestMethod.GET)
|
|
|
|
|
public ModelAndView password(ModelAndView model) {
|
|
|
|
|
model.setViewName("member/password");
|
|
|
|
|
return model;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 处理会员密码更新的POST请求,调用会员服务来更新会员密码,并返回相应的更新结果
|
|
|
|
|
*
|
|
|
|
|
* @param member 包含要更新密码相关信息的MemberEntity对象,通过请求体接收
|
|
|
|
|
* @return 返回表示密码更新操作结果的Result对象
|
|
|
|
|
*/
|
|
|
|
|
@RequestMapping(value = "member/password/update", method = RequestMethod.POST)
|
|
|
|
|
@ResponseBody
|
|
|
|
|
public Result updatePwd(@RequestBody MemberEntity member) {
|
|
|
|
|
return memberService.updatePwd(member);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 处理会员上传文件的POST请求,接收上传的文件以及HttpServletRequest对象,实现文件上传功能,包括创建文件存储目录、生成文件名、文件流读写等操作,最后返回文件上传的结果信息
|
|
|
|
|
*
|
|
|
|
|
* @param file 上传的MultipartFile类型文件对象,通过请求参数接收
|
|
|
|
|
* @param request 当前的HttpServletRequest对象,可获取请求相关的一些信息(此处可能未使用到,但在某些场景下可能会用到)
|
|
|
|
|
* @return 返回包含文件上传状态、提示信息、文件路径等相关信息的UploaderMessage对象,告知前端文件上传的结果情况
|
|
|
|
|
* @throws IOException 如果在文件读写等操作过程中出现I/O异常则抛出
|
|
|
|
|
*/
|
|
|
|
|
@RequestMapping(value = "/member/uploadFile", method = RequestMethod.POST)
|
|
|
|
|
@ResponseBody
|
|
|
|
|
public UploaderMessage uploadFileHandler(@RequestParam("file") MultipartFile file, HttpServletRequest request) throws IOException {
|
|
|
|
|
|
|
|
|
|
// 判断上传的文件是否为空,如果为空则直接返回文件为空的错误提示信息
|
|
|
|
|
if (!file.isEmpty()) {
|
|
|
|
|
InputStream in = null;
|
|
|
|
|
OutputStream out = null;
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
// 根据当前日期构建文件存储的路径,方便按日期分类存储文件
|
|
|
|
|
String path = fileStoragePath + DateUtils.format(new Date(), "yyyyMMdd");
|
|
|
|
|
File dir = new File(path);
|
|
|
|
|
// 如果目录不存在,则创建相应的目录,确保文件有存储的位置
|
|
|
|
|
if (!dir.exists())
|
|
|
|
|
dir.mkdirs();
|
|
|
|
|
|
|
|
|
|
// 生成头像文件名,结合缓存获取的编号以及原文件名的后缀组成完整的文件名
|
|
|
|
|
String avatorName = this.getAvatorNo() + file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
|
|
|
|
|
// 获取文件输入流,用于读取上传文件的内容
|
|
|
|
|
in = file.getInputStream();
|
|
|
|
|
// 创建文件输出流,用于将读取的文件内容写入到服务器指定的存储位置
|
|
|
|
|
out = new FileOutputStream(path + "/" + avatorName);
|
|
|
|
|
|
|
|
|
|
byte[] b = new byte[1024];
|
|
|
|
|
int len = 0;
|
|
|
|
|
// 通过循环读取输入流中的文件内容,并写入到输出流中,实现文件的复制保存操作
|
|
|
|
|
while ((len = in.read(b)) > 0) {
|
|
|
|
|
out.write(b, 0, len);
|
|
|
|
|
}
|
|
|
|
|
// 关闭输出流,释放资源
|
|
|
|
|
out.close();
|
|
|
|
|
// 关闭输入流,释放资源
|
|
|
|
|
in.close();
|
|
|
|
|
// 记录文件在服务器上的存储位置信息到日志中,方便后续查看和排查问题
|
|
|
|
|
logger.info("Server File Location=" + path + avatorName);
|
|
|
|
|
|
|
|
|
|
// 创建表示文件上传成功的消息对象,并设置相应的成功状态、提示信息、文件路径以及文件所在的域名等信息
|
|
|
|
|
UploaderMessage msg = new UploaderMessage();
|
|
|
|
|
msg.setStatus(Status.SUCCESS);
|
|
|
|
|
msg.setStatusMsg("File upload success");
|
|
|
|
@ -112,22 +169,26 @@ public class AccountController {
|
|
|
|
|
msg.setFileDomain(setting.domain);
|
|
|
|
|
return msg;
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
// 如果在文件上传过程中出现异常,创建表示文件上传失败的消息对象,并设置相应的错误状态和提示信息,然后返回该对象告知前端上传失败
|
|
|
|
|
UploaderMessage msg = new UploaderMessage();
|
|
|
|
|
msg.setStatus(Status.ERROR);
|
|
|
|
|
msg.setError("File upload file");
|
|
|
|
|
return msg;
|
|
|
|
|
} finally {
|
|
|
|
|
// 在最终块中确保输出流资源被正确关闭,避免资源泄露
|
|
|
|
|
if (out!= null) {
|
|
|
|
|
out.close();
|
|
|
|
|
out = null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 在最终块中确保输入流资源被正确关闭,避免资源泄露
|
|
|
|
|
if (in!= null) {
|
|
|
|
|
in.close();
|
|
|
|
|
in = null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// 如果上传的文件为空,创建表示文件为空的错误消息对象,并设置相应的错误状态和提示信息,然后返回该对象告知前端文件为空
|
|
|
|
|
UploaderMessage msg = new UploaderMessage();
|
|
|
|
|
msg.setStatus(Status.ERROR);
|
|
|
|
|
msg.setError("File is empty");
|
|
|
|
@ -135,7 +196,11 @@ public class AccountController {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 生成头像编号的方法,先根据当前日期格式化得到年月格式的字符串作为缓存的键前缀,然后通过缓存服务获取自增的编号,再按照指定格式进行格式化,最后拼接前缀生成完整的头像编号
|
|
|
|
|
*
|
|
|
|
|
* @return 返回生成的头像编号字符串
|
|
|
|
|
*/
|
|
|
|
|
private String getAvatorNo() {
|
|
|
|
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM");
|
|
|
|
|
String format = sdf.format(new Date());
|
|
|
|
|