1.1 登录的时候做vip的判断;
1.2 使用JWT(Java Web token),验证登录,更加安全
通过判断昨天是否登录,可以判断;
将每次签到的记录保存在redis中,判断保存的数量,有多少个,就连续签到多少天;
签到流水如果可以,直接保存在数据库;(考虑使用redis的bitMaps);
《Redis实战》之使用BitMap实现用户签到功能:https://blog.csdn.net/qq_31905135/article/details/124032880
Redis中是利用String类型数据结构实现BitMap,因此最大上限是512M,转换为bit则是2^32个bit位。
bitmap的操作命令有:
setbit:向指定位置offset存入一个0或1
getbit:获取指定位置offset的bit值
bitcount:统计BitMap中值为1的bit位的数量
bitfield: 操作(查询,修改,自增)BitMap中bit数组中的指定位置offset的值
bitfield_ro: 获取BitMap中bit数组,并以十进制形式返回
bittop: 将多个BitMap的结果做位运算(与,或,异或)
bitpos: 查找bit数组中指定范围内第一个0或者1出现的位置
每天0点的时候每个用户初始化一条没有登录的信息(例如:status=0),如果用户登录了就对用户的状态进行修改(status=1);
redis中存用户vip的唯一标识key,设置ttl,并设置用户vip字段为vip;续约直接增加key值得时间;
一些需要使用到vip的权限的时候,先对vip进行检查,如果vip失效,需要将用户的vip字段设置为 普通会员;(主要两个地方判断:1.用户登录;2.用户使用vip权限);这样可以大大节省时时判断用户vip状态的消耗;
考虑,模糊匹配,近义词,(俗名),ES分词,IK分词(ElasticSearch+Kibana)
需要添加热词库,只有在热词库中的词语,命中才算热词;热词的管理权在商家手里;
可以根据不同时段进行不同数量的展示,人越多,数量越多;

1.1 :关于背景色:也可以不用,主要看你的轮播图占多大空间,如果是下图那样占全部空间,因为图片不可能将其全部占据,如果不用背景色,那么,轮播图片的两旁就是白色,会很难看。所以看自己
1.2 商品id:有时候,需要客户点击轮播图,直接跳转到 商品详情页面,所以 商品id 是线索
1.3 商品分类id:有时,点击后,会跳转到某一分类下,不是具体的商品详情页面
1.4 轮播图类型(type):用于判断,可以根据商品id或者分类进行页面跳转,1:商品 2:分类
//1.返回给前端的日期格式
//实体参数上添加日期格式化注解
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
//2.前端传给后端的日期格式
//实体参数上添加日期格式化注解
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
1.先说结论:在feign接口调用时使用表单形式(@RequestParam)传date类型会发生时间精度错乱,在8时区会多14个小时。
2.使用json格式(@RequestBody)传date类型不会发生这种情况。
表单形式我的解决办法是:在对外暴露的feign接口中使用字符串类型。
3.(String date)来接收日期,在真正feign调用的controller服务中使用@DateTimeFormat(pattern=“yyyy-MM-dd”)Date date来转换字符串类型的日期。
4.将接收到的时间减去14小时(强烈不建议,比较麻烦且冗余,多次远程调用可能会再相差时间)。
5.扩展ZonedDateTime
java8 日期 时间 时区:https://blog.csdn.net/z69183787/article/details/87176339
ZonedDateTime时区日期时间类的运用:https://blog.csdn.net/qx020814/article/details/125580729
LocalDateTime、OffsetDateTime、ZonedDateTime互转:https://blog.csdn.net/f641385712/article/details/112732546
需要添加@ApiModel(value = "xxx")注解,@ApiModelProperty(value = "xxx")注解,由于我之前没有怎么使用这个注解,导致忘记了,特此记录一下;
将要处理的消息内容转换成JOSN字符对象,再放入到map集合中,监听到消息后,根据不同的消息内容进行不同的处理;
//将订单信息封装成map集合,方便发送
Map<String, Object> orderMsgMapToQueue = new HashMap<>();
//父订单
orderMsgMapToQueue.put("ordersForm", JSON.toJSONString(ordersForm));
//子订单
orderMsgMapToQueue.put("orderItemListSize", orderItemListForm.size());
for (int i = 0; i < orderItemListForm.size(); i++) {
orderMsgMapToQueue.put("orderItem"+i,JSON.toJSONString(orderItemListForm.get(i)));
}
//发送生成抢购订单的消息到消息队列,并在redis中添加此订单的记录
//0 正在生成
if(redisUtils.set("weddingshop:orders:"+ordersForm.getOid(),ordersForm)){
//发送生成的 订单信息 到 消息队列
rabbitTemplate.convertAndSend(OrderMQConstant.WEDDINGSHOP_SAVE_ORDER_EXCHANGE,
OrderMQConstant.WEDDINGSHOP_SAVE_ORDER_ROUTING,
orderMsgMapToQueue);
}
监听到消息后,从map集合中取出不同的消息,根据不同的消息内容进行不同的处理;
@Slf4j
@Component
//指定接听的 消息队列 名字
@RabbitListener(queues = OrderMQConstant.WEDDINGSHOP_SAVE_ORDER_QUEUE)
public class SeckillOrderSaveListener {
@Autowired
private RedisUtils redisUtils;
@Autowired(required = false)
private OrdersMapper ordersMapper;
@Autowired(required = false)
private OrderItemMapper orderItemMapper;
@Autowired
private OrdersService ordersService;
/**
* @author : huayu
* @date : 1/11/2022
* @param : [directMsgJson]
* @return : void
* @description : Direct 直连模式消费者One,消费信息
*/
//指定消息队列中的消息,交给对应的方法处理
@RabbitHandler
public void saveSeckillOrder(Map<String,Object> orderMsgMapToQueue){
//子订单消息
if(orderMsgMapToQueue.get("orderItemListSize") != null){
//插入子订单
int orderItemListSize = Integer.parseInt(orderMsgMapToQueue.get("orderItemListSize").toString());
for (int i = 0; i < orderItemListSize; i++) {
OrderItem orderItem = JSON.parseObject(orderMsgMapToQueue.get("orderItem" + i).toString(), OrderItem.class);
log.info("***** 秒杀抢购子订单:{},开始入库 ******",orderItem);
if(orderItemMapper.insert(orderItem) > 0){
log.info("***** 秒杀抢购子订单:{},开始入库 成功 ******",orderItem);
}
}
}
//父订单消息
if(orderMsgMapToQueue.get("ordersForm")!= null){
Orders ordersForm = JSON.parseObject(orderMsgMapToQueue.get("ordersForm").toString(), Orders.class);
log.info("***** 秒杀抢购父订单:{},开始入库 ******",ordersForm);
//TODO 将消息中的订单实体对象,调入业务接口,插入到数据库,和redis中
//插入 父订单
if(ordersMapper.insert(ordersForm)>0){
log.info("***** 秒杀抢购父订单:{},入库 成功 ******",ordersForm);
}
}
//父订单 付款后 ,操作
if(orderMsgMapToQueue.get("ordersPayOid") != null){
// 父订单付款后 对 父订单 修改状态,用户增加积分 和 子订单 修改状态,生成物流单号
String ordersPayOid = orderMsgMapToQueue.get("ordersPayOid").toString();
log.info("------ 父订单:{},支付成功,对 父订单 修改状态,用户增加积分 和 子订单 修改状态,生成物流单号------",ordersPayOid);
if(ordersService.paySuccessOrders(ordersPayOid)){
log.info("------ 父订单:{},入库成功,对 父订单 修改状态,用户增加积分 和 子订单 修改状态,生成物流单号------",ordersPayOid);
}
}
}
}
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="
假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit
SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手
我正在尝试创建一个带有项目符号字符的Ruby1.9.3字符串。str="•"+"helloworld"但是,当我输入它时,我收到有关非ASCII字符的语法错误。我该怎么做? 最佳答案 你可以把Unicode字符放在那里。str="\u2022"+"helloworld" 关于ruby-如何在Ruby字符串中插入项目符号字符?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1195
我的Rails站点使用了一个确实不是很好的gem。每次我需要做一些新的事情时,我最终不得不花费与向实际Rails项目添加代码一样多的时间来为gem添加功能。但我不介意,我将我的Gemfile设置为指向我的gem的GitHub分支(我尝试提交PR,但维护者似乎已经下台)。问题是我真的没有找到一种合理的方法来测试我添加到gem的新东西。在railsc中测试它会特别好,但我能想到的唯一方法是a)更改~/.rvm/gems/.../foo。rb,这看起来不对或者b)升级版本,推送到Github,然后运行bundleup,这除了耗时之外显然是一场灾难,因为我不确定我所做的promise是否正
我一直在尝试使用nanoc用于生成静态网站。我需要组织一个复杂的排列页面,我想让我的内容保持干燥。包含或合并的概念在nanoc系统中如何运作?我已阅读文档,但似乎找不到我想要的内容。例如:我如何获取两个部分内容项并将它们合并到一个新的内容项中。在staticmatic您可以在您的页面中执行以下操作。=partial('partials/shared/navigation')类似的约定在nanoc中如何运作? 最佳答案 这里是nanoc的作者。在nanoc中,部分是布局。因此,您可以拥有layouts/partials/shared/
我安装了ruby、yeoman,当我运行我的项目时,出现了这个错误:Warning:Running"compass:dist"(compass)taskWarning:YouneedtohaveRubyandCompassinstalledthistasktowork.Moreinfo:https://github.com/gruUse--forcetocontinue.Use--forcetocontinue.我有进入可变session目标的路径,但它不起作用。谁能帮帮我? 最佳答案 我必须运行这个:geminstallcom
我有一个包含多个组件的存储库,其中大部分是用JavaScript(Node.js)编写的,一个是用Ruby(RubyonRails)编写的。我想要一个.travis.yml文件来触发一个运行每个组件的所有测试的构建。根据thisTravisCIGoogleGroupthread,目前还没有官方支持。我的目录结构是这样的:.├──构建服务器├──核心├──扩展├──网络应用├──流浪文件├──package.json├──.travis.yml└──生成文件我希望能够运行特定版本的Ruby(2.2.2)和Node.js(0.12.2)。我已经有了一个make目标,所以maketest在每