• 瑞吉外卖项目(二)


    前端

    JSON对象:
    和JS对象区别:

    JSON对象的属性名(key)必须被包含在双引号之中。
    而JavaScript对象除了有空格的属性名、中间有连字符-的属性名必须在双引号之中外, 其它随意。
    
    • 1
    • 2
    不能在JSON对象中定义方法, 而在JavaScript对象中可以。
    
    • 1

    JSON字符串:
    在前端和后台之间传递数据可以使用JSON,但是实际上传递的是JSON字符串,而JSON对象是不可以直接进行传递的。
    JSON字符串就是在JSON对象两边套上 ' 形成的字符串。

    let JSONObject  = {"k1":"v1","k2":"v2"};			// JSON对象  
    let JSONString  = '{"k1":"v1","k2":"v2"}';			// JSON字符串  
    
    • 1
    • 2

    JSON.parse :将JSON字符串 转换为 JS对象。
    JSON.stringify :将JSON对象 转换为 JSON 字符串。
    computed:计算属性
    this.$refs[formName].validate:
    < template slot-scope=“scope” >

    响应JSON数据自定义序列化类型

    封装响应数据的实体类

    @Data
    public class employee implements Serializable {
        private static final long serialVersionUID = 1L;
        private Long id;
        private String username;
        private String name;
        private String password;
        private String phone;
        private String sex;
        private String id_number;
        private Integer status;
    
        private LocalDateTime create_time;
        private LocalDateTime update_time;
    
        private Long create_user;
        private Long update_user;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在这里插入图片描述

    /**
     * 对象转换器: 基于jackson将Java对象转为json, 或者将json转为Java对象
     * 将JSON解析为Java对象的过程称为      [从JSON反序列化Java对象]
     * 从Java对象生成JSON的过程称为       [序列化Java对象到JSON]
     */
    public class JackSonObjectMapper extends ObjectMapper{
    
        public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
        public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
        public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";
    
        public JackSonObjectMapper() {
            super();
    
            //收到未知属性时不报异常
            this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);
            //反序列化时, 属性不存在的兼容处理
            this.getDeserializationConfig().withoutFeatures(FAIL_ON_UNKNOWN_PROPERTIES);
    
            SimpleModule simpleModule = new SimpleModule()
            // 反序列化        
                    .addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                    .addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
                    .addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)))
            // 序列化 响应 JSON 数据时, 改变下列类型的序列化类型
                    .addSerializer(BigInteger.class, ToStringSerializer.instance)
                    .addSerializer(Long.class, ToStringSerializer.instance) // 将 domain中Long类型的字段, 序列化为 JSON 时,序列化为 String
                    .addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                    .addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
                    .addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));
    
            // 注册功能模块 例如, 可以添加自定义序列化器和反序列化器
            this.registerModule(simpleModule);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    在 WebMvcConfig 配置类中,复写 extendMessageConverters 方法,扩展消息转换器。

        /**
         *  扩展 mvc 框架 的消息转换器
         * @param converters
         */
        @Override
        protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
            log.info("扩展消息转换器....");
            // 创建 消息转换器对象
            MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
    
            // 设置 对象转换器
            messageConverter.setObjectMapper(new JackSonObjectMapper());
    
            // 追加到 mvc 框架的转换器集合中, 并放到最前面优先使用
            converters.add(0,messageConverter);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述

    ThreadLocal

    使用 SpringBoot 内嵌服务器时,如果启动之后,又修改了前端页面文件,需要后端重启服务器,前端清除浏览器缓存,这样才可以奏效。

    ThreadLocal,是Thread的局部变量。
    当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本。
    所以每一个线程都可以独立地改变自己的副本,不会影响其他线程所对应的副本。ThreadLocal为每个线程提供单独一份存储空间,具有线程隔离的效果。

    /**
     *  基于 ThreadLocal 封装工具类
     */
    public class BaseContext {
    
        // ThreadLocal 是线程隔离的
        private static ThreadLocal<Long> threadLocal = new ThreadLocal<>();
    
        // 存值
        public static void setCurrentId(Long id){
            threadLocal.set(id);
        }
    
        // 取值
        public static Long getCurrentId(){
            return threadLocal.get();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    // 使用
    Long empId = (Long) request.getSession().getAttribute("employee");
    BaseContext.setCurrentId(empId);
    
    metaObject.setValue("updateUser",BaseContext.getCurrentId());
    
    • 1
    • 2
    • 3
    • 4
    • 5

    数据表主键

    为什么数据表主键没有设置自增,后端在做插入的时候,也没有进行自动填充,设置默认值,但是却会得到一个值。
    因为 mybatis-plus 对主键生成的默认策略是:ASSIGN_ID ,该策略会使用雪花算法自动生成主键 ID,主键类型为 Long 或 String。
    Mybatis-plus主键生成策略

  • 相关阅读:
    ruoyi-vue-pro 项目安装使用过程中的问题解决
    若依4.7.6 版本任意文件下载(CVE-2023-27025)
    【Qt炫酷动画】3.QPauseAnimation暂停动画类
    PHP 图书资料管理系统mysql数据库web结构apache计算机软件工程网页wamp
    RHCE之web服务器搭建
    Yolov10笔记
    ros学习笔记(11.14实时更新中)
    MySQL read 查询语句5 增强
    数字图像处理——实验四 数字图像的边缘检测实验
    使用 Java api在MongoDB中获取最后插入的文档ID
  • 原文地址:https://blog.csdn.net/qq_53318060/article/details/125410325