果然写的代码不会白费,今天感觉写业务的时候能稍微自己挤一点东西出来,虽然后来依旧拉跨,但还是有一点思路在的;

今天主要编写文件的上传下载功能,轮播图的目标图片显示功能,轮播图的修改更新功能,


1:文件的下载功能(可满足轮播图的加载):

@RequestMapping("/download")
    @IgnoreAuth
    public ResponseEntity<byte[]> download(@RequestParam String fileName){
        try{
            File path=new File(ResourceUtils.getURL("classpath:static").getPath());
            if(!path.exists()){
                path=new File("");
                /*这里将path设置为空那这里path=“/static”;
                    这里叫做兜底机制,放置后续路径拼接出错;
                */
            }
            File upload=new File(path.getAbsolutePath(),"/file/");
            if(!upload.exists()){
                upload.mkdirs();
            }
            /*  这两个判断的目的都是为了保证后续文件操作有可用的路径,是一种健壮性处理方式*/
            File file=new File(upload.getAbsolutePath()+"/"+fileName);
            if(file.exists()){
                /*if(!fileService.canRead(file,SessionManger.getSessionUser())){
                    getResponse().sendError(403);
                }*/
                HttpHeaders headers =new HttpHeaders();
                headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
                headers.setContentDispositionFormData("attachment",fileName);
                return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.CREATED);
            }
            //FileUtils是apache的一个工具包而不是自己编写的工具类
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new ResponseEntity<byte[]>(HttpStatus.INTERNAL_SERVER_ERROR);

    }

原项目作者用的是比较老套的方法因为导入的包是Java.io我问过了ai,说是比较老套的方法,目前有NIO等方法可优化解决

(1):首先定义download方法这个方法返回值为ResponseEntity这个类是spring已经包装好的,里面用一个String字符串来接收参数

(2):通过一个try-catch方法,指定静态路径搜索服务器自有的静态资源,如果没有就返回路径为/static和/file/并且定义响应头的格式

重点:

headers.setContentDispositionFormData("attachment",fileName);

这一行定义了浏览器该如何处理这个响应,是确保它作为一个附件进行下载,而不是进行在线展示

最后返回响应格式,是一个二进制数据;


2:轮播图的目标图片显示功能

@RequestMapping("/info/{id}")
    public R info(@PathVariable("id") Long id){
    Config config=configService.selectView(new EntityWrapper<Config>().eq("id",id));
    return R.ok().put("data",config);
    }

这个就很简单用一个id去接收参数,然后通过ConfiService里定义的selectVIew方法进行查找返回

方法参数内还是用一个实体构造器来编写SQL语句

sql语句:WHERE config.id="id"(这个id就是浏览器传过来的url参数)

package com.palop.dao;

import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.palop.entity.Config;
import com.palop.entity.view.ConfigView;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface ConfigDao extends BaseMapper<Config> {
   

    ConfigView selectView(@Param("ew") Wrapper<Config> wrapper);
}

对应的dao层代码,@Param注解可以删去,因为我上边代码并没有将实体构造器实例化为ew

然后xml文件中还是老一套:\

<select id="selectView" resultType="com.palop.entity.view.ConfigView">
SELECT config.* FROM config config
        <where>1=1 ${ew.sqlSegment}</where>
    </select>

就是构建一个完整的sql语句去查询具体的底层实现目前不了解,还是很模糊,但可以了解的是Dao层和Resource中的mapper就是JavaBean和DataBase沟通的桥梁;;;


3:轮播图的修改更新功能

 @RequestMapping("/update")
    @Transactional
    @SysLog("修改轮播图")
    public R update(@RequestBody Config config,HttpServletRequest request){
    configService.updateById(config);
    return R.ok();
    }

其中@Transactional注释的作用是:

声明该方法需要在事务环境下执行。
特性:
如果方法执行过程中发生异常,事务会回滚。
如果没有异常,事务正常提交。
适用场景:适用于数据库写操作(如更新、删除),确保数据一致性。、

然后用一个Config实体类去接收请求中的负载是一个json文件,{

  1. addtime: 1743691696000
  2. id: 3
  3. name: "swiper3"
  4. value: "file/1750264200050.jpg"

}

然后运用的这个updateById方法是IService里已经封装好的方法

,哈哈,自己有点太心急了。这个项目要说实际情况的话挺适合我的,作为java的入门学习,但我老觉得这个里边东西有点些许达不到我心里想要的,但我不能一口一个胖子吧,慢慢来,一定要把这个项目重写完,就算写完啥也不会也没关系有个大致了解也很不错,,加油加油加油!!!!

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐