• 小孟再接盲盒小程序,3天开发完!


    大家好,我是程序员小孟。

    前面开发了很多的商业的单子,私活联盟的小伙伴慢慢的逐渐搞自己的产品。

    前面的话,开发了盲盒小程序,最近又接了一款盲盒小程序。因为前面有开发过,所以我们的成本也少了很多。

    盲盒小程序开发

    价格不高,也接了。

    是个海外的客户,目前该版本支持中英文版本,版本可以是小程序、H5、安卓、iOS等等。

    一,系统的功能需求。

    该系统有商城的功能和盲盒的功能,在该系统中可以进行购买和参与盲盒好的功能,盲盒的分为一番赏和魔力赏,都非常的好玩。用户还可以查询个人的信息、个人订单,如果没有注册账户,则需要登录账户,支持微信登录和手机的登录。

    管理员在后台可以进行所有信息的管理,包括盲盒、商品订单的信息。

    该系统面向的是一些商家想做一些盲盒活动的用户。

    系统用户和管理员,用户在前台进行操作,管理员在后台操作。

    二,项目的技术栈

    在这里插入图片描述

    三,项目的演示

    下面的设计禁止商用,已经申请专利,小孟专业的开发,后面我会不断端开发,也会分享很多的项目。

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    目前该版本支持中英文的版本,下面是后台系统。

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    四,核心代码

    package com.stylefeng.guns.core.aop;
    
    import com.stylefeng.guns.core.base.tips.ErrorTip;
    import com.stylefeng.guns.core.exception.GunsException;
    import com.stylefeng.guns.core.exception.GunsExceptionEnum;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.http.HttpStatus;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.bind.annotation.ResponseStatus;
    
    /**
     * 全局的的异常拦截器(拦截所有的控制器)(带有@RequestMapping注解的方法上都会拦截)
     *
     * @author xiaomeng
     * @微信:fly996868
     */
    public class BaseControllerExceptionHandler {
    
        private Logger log = LoggerFactory.getLogger(this.getClass());
    
        /**
         * 拦截业务异常
         */
        @ExceptionHandler(GunsException.class)
        @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
        @ResponseBody
        public ErrorTip notFount(GunsException e) {
            log.error("业务异常:", e);
            return new ErrorTip(e.getCode(), e.getMessage());
        }
    
        /**
         * 拦截未知的运行时异常
         */
        @ExceptionHandler(RuntimeException.class)
        @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
        @ResponseBody
        public ErrorTip notFount(RuntimeException e) {
            log.error("运行时异常:", e);
            return new ErrorTip(GunsExceptionEnum.SERVER_ERROR.getCode(), GunsExceptionEnum.SERVER_ERROR.getMessage());
        }
    
    }
    
    
    package com.stylefeng.guns.core.config;
    
    import com.alibaba.fastjson.serializer.SerializeConfig;
    import com.alibaba.fastjson.serializer.SerializerFeature;
    import com.alibaba.fastjson.serializer.ToStringSerializer;
    import com.alibaba.fastjson.serializer.ValueFilter;
    import com.alibaba.fastjson.support.config.FastJsonConfig;
    import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.http.MediaType;
    
    import java.math.BigInteger;
    import java.nio.charset.Charset;
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * fastjson配置类
     */
    @Configuration("defaultFastjsonConfig")
    @ConditionalOnClass(com.alibaba.fastjson.JSON.class)
    @ConditionalOnMissingBean(FastJsonHttpMessageConverter.class)
    @ConditionalOnWebApplication
    public class DefaultFastjsonConfig {
    
        @Bean
        public FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
            FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
            converter.setFastJsonConfig(fastjsonConfig());
            converter.setSupportedMediaTypes(getSupportedMediaType());
            return converter;
        }
    
        /**
         * fastjson的配置
         */
        public FastJsonConfig fastjsonConfig() {
            FastJsonConfig fastJsonConfig = new FastJsonConfig();
            fastJsonConfig.setSerializerFeatures(
                    SerializerFeature.PrettyFormat,
                    SerializerFeature.WriteMapNullValue,
                    SerializerFeature.WriteEnumUsingToString
            );
            fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
            ValueFilter valueFilter = new ValueFilter() {
                public Object process(Object o, String s, Object o1) {
                    if (null == o1) {
                        o1 = "";
                    }
                    return o1;
                }
            };
            fastJsonConfig.setCharset(Charset.forName("utf-8"));
            fastJsonConfig.setSerializeFilters(valueFilter);
    
            //解决Long转json精度丢失的问题
            SerializeConfig serializeConfig = SerializeConfig.globalInstance;
            serializeConfig.put(BigInteger.class, ToStringSerializer.instance);
            serializeConfig.put(Long.class, ToStringSerializer.instance);
            serializeConfig.put(Long.TYPE, ToStringSerializer.instance);
            fastJsonConfig.setSerializeConfig(serializeConfig);
            return fastJsonConfig;
        }
    
        /**
         * 支持的mediaType类型
         */
        public List<MediaType> getSupportedMediaType() {
            ArrayList<MediaType> mediaTypes = new ArrayList<>();
            mediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
            return mediaTypes;
        }
    
    }
    
    
    package com.stylefeng.guns.core.config;
    
    import com.stylefeng.guns.core.base.controller.GunsErrorView;
    import com.stylefeng.guns.core.exception.GunsException;
    import com.stylefeng.guns.core.exception.GunsExceptionEnum;
    import com.stylefeng.guns.core.util.DateUtil;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.core.convert.converter.Converter;
    import org.springframework.core.convert.support.GenericConversionService;
    import org.springframework.web.bind.support.ConfigurableWebBindingInitializer;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
    import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
    
    import javax.annotation.PostConstruct;
    import java.util.Date;
    import java.util.regex.Pattern;
    
    @Configuration
    public class DefaultWebConfig extends WebMvcConfigurationSupport {
    
        @Autowired
        private RequestMappingHandlerAdapter handlerAdapter;
    
        @Bean("error")
        public GunsErrorView error() {
            return new GunsErrorView();
        }
    
        @PostConstruct
        public void addConversionConfig() {
            ConfigurableWebBindingInitializer initializer = (ConfigurableWebBindingInitializer) handlerAdapter.getWebBindingInitializer();
            GenericConversionService genericConversionService = (GenericConversionService) initializer.getConversionService();
            genericConversionService.addConverter(new StringToDateConverter());
        }
    
        public class StringToDateConverter implements Converter<String, Date> {
    
            @Override
            public Date convert(String dateString) {
    
                String patternDate = "\\d{4}-\\d{1,2}-\\d{1,2}";
                String patternTimeMinutes = "\\d{4}-\\d{1,2}-\\d{1,2} \\d{1,2}:\\d{1,2}";
                String patternTimeSeconds = "\\d{4}-\\d{1,2}-\\d{1,2} \\d{1,2}:\\d{1,2}:\\d{1,2}";
    
                boolean dateFlag = Pattern.matches(patternDate, dateString);
                boolean timeMinutesFlag = Pattern.matches(patternTimeMinutes, dateString);
                boolean timeSecondsFlag = Pattern.matches(patternTimeSeconds, dateString);
    
                if (dateFlag) {
                    return DateUtil.parseDate(dateString);
                } else if (timeMinutesFlag) {
                    return DateUtil.parseTimeMinutes(dateString);
                } else if (timeSecondsFlag) {
                    return DateUtil.parseTime(dateString);
                } else {
                    throw new GunsException(GunsExceptionEnum.INVLIDE_DATE_STRING);
                }
            }
        }
    }
    

    我是程序员小孟,专注软件开发,系统分享,有问题的小伙伴,欢迎交流。

    感谢三联,点赞、关注!

    在这里插入图片描述

  • 相关阅读:
    Java笔记:ThreadLocal
    X12学习手册
    349. 两个数组的交集【力扣】
    android.app.RemoteServiceException: can‘t deliver broadcast
    Pagehelper分页插件的原理
    对话MySQL之父:一个优秀程序员可抵5个普通程序员
    Unity图形节点插件xNode简单使用说明
    git工具下载和安装
    PostgreSQL、KingBase 数据库 ORDER BY LIMIT 查询缓慢案例
    计算机主机名与用户名区别
  • 原文地址:https://blog.csdn.net/mengchuan6666/article/details/139754477