现在的年轻人是真的会玩,越来越新的东西出来,越来越好玩的东西流行。
就像最近很火的地摊盲盒。
讲真的,这之前我都不知道盲盒是啥。
前面有个粉丝让我开发盲盒小程序,为此我还去地摊上找摊位买了几个盲盒玩玩!
很好玩,很有意思。
然后我我去网上看了下,很多的公司都在推盲盒的app或者小程序。
例如网易的盲盒小程序,我一直在csdn更新文章,经常收到他们的盲盒小程序的通知。

下面是我开发的:







下面和大家简单的介绍下开发的这个小程序。有很多核心的地方,可能没办法公开。
目录
因为客户没有技术方面的要求,那就按照我习惯用的技术开发的,无所谓什么最新不最新技术了。
后台框架:SpringBoot,
数据库采用的Mysql,
后端的页面采用的Vue进行开发,
缓存用的Redis,
搜索引擎采用的是elasticsearch,
ORM层框架:MyBatis,
连接池:Druid,
分库分表:MyCat,
权限:SpringSecurity,
代码质量检查:sonar。
@Controller
@RequestMapping("/addressInfo")
public class AddressInfoController extends BaseController {
@Resource
private AddressInfoService addressInfoService;
@MustSetForOrderNoAnnotation
@AuthenticationAnnotation
@SetMenuAnnotation
@RequestMapping("listPage")
public ModelAndView listPage(ModelAndView modelAndView) {
modelAndView.setViewName("addressInfo/list");
return modelAndView;
}
@MustSetForOrderNoAnnotation
@AuthenticationAnnotation
@RequestMapping("addPage")
public String addPage() {
return "addressInfo/add";
}
@MustSetForOrderNoAnnotation
@AuthenticationAnnotation
@RequestMapping("editPage")
public ModelAndView editPage(ModelAndView modelAndView, Long id) {
modelAndView.addObject("id", id);
modelAndView.setViewName("addressInfo/edit");
return modelAndView;
}
@MustSetForOrderNoAnnotation
@AuthenticationAnnotation
@RequestMapping("/getList")
@ResponseBody
public ReturnDataForLayui getList(AddressInfo addressInfo) {
addressInfo.setIsDeleted(PageBean.isDeletedNo);
return addressInfoService.getList(addressInfo);
}
@MustSetForOrderNoAnnotation
@AuthenticationAnnotation
@RequestMapping("/add")
@ResponseBody
public ReturnData add(AddressInfo addressInfo) {
return addressInfoService.add(addressInfo);
}
@MustSetForOrderNoAnnotation
@AuthenticationAnnotation
@RequestMapping("/update")
@ResponseBody
public ReturnData update(AddressInfo addressInfo) {
return addressInfoService.update(addressInfo);
}
@MustSetForOrderNoAnnotation
@AuthenticationAnnotation
@RequestMapping("/updateDelete")
@ResponseBody
public ReturnData updateDelete(AddressInfo addressInfo) {
addressInfo.setIsDeleted(PageBean.isDeletedYes);
return addressInfoService.updateDelete(addressInfo);
}
@MustSetForOrderNoAnnotation
@AuthenticationAnnotation
@RequestMapping("/updateDeleteBatch")
@ResponseBody
public ReturnData updateDeleteBatch(String ids) {
List<Long> idList = JSON.parseArray(ids, Long.class);
return addressInfoService.updateDeleteBatch(idList);
}
package com.cnewdream.controller;
import com.cnewdream.utils.ReturnData;
import com.cnewdream.utils.RedisUtils;
import javax.annotation.Resource;
import javax.servlet.ServletContext;
public class BaseController {
@Resource
protected ServletContext servletContext;
@Resource
protected RedisUtils redisUtils;
}
@RequestMapping("/blindBoxInfo")
public class BlindBoxInfoController extends BaseController {
@Resource
private BlindBoxInfoService blindBoxInfoService;
@MustSetForOrderNoAnnotation
@AuthenticationAnnotation
@SetMenuAnnotation
@RequestMapping("listPage")
public ModelAndView listPage(ModelAndView modelAndView) {
modelAndView.setViewName("blindBoxInfo/list");
return modelAndView;
}
@MustSetForOrderNoAnnotation
@AuthenticationAnnotation
@RequestMapping("addPage")
public String addPage() {
return "blindBoxInfo/add";
}
@MustSetForOrderNoAnnotation
@AuthenticationAnnotation
@RequestMapping("editPage")
public ModelAndView editPage(ModelAndView modelAndView, Long id) {
modelAndView.addObject("id", id);
modelAndView.setViewName("blindBoxInfo/edit");
return modelAndView;
}
@MustSetForOrderNoAnnotation
@AuthenticationAnnotation
@RequestMapping("goodsLevelEditPage")
public ModelAndView goodsLevelEditPage(ModelAndView modelAndView, Long id) {
BlindBoxInfo blindBoxInfo = new BlindBoxInfo();
blindBoxInfo.setId(id);
ReturnDataForLayui list = blindBoxInfoService.getList(blindBoxInfo);
ArrayList<BlindBoxInfo> blindBoxInfos = (ArrayList<BlindBoxInfo>) list.getData();
BlindBoxInfo blindBoxInfoDb = blindBoxInfos.get(0);
String goodsLevel = blindBoxInfoDb.getGoodsLevel();
GoodsLevelInfo goodsLevelInfo = JSONUtils.json2pojo(goodsLevel, GoodsLevelInfo.class);
if (goodsLevelInfo == null) {
goodsLevelInfo = new GoodsLevelInfo();
}
goodsLevelInfo.setId(id);
modelAndView.addObject("goodsLevelInfo", goodsLevelInfo);
modelAndView.setViewName("blindBoxInfo/goodsLevelEdit");
return modelAndView;
}
@MustSetForOrderNoAnnotation
@AuthenticationAnnotation
@RequestMapping("/getList")
@ResponseBody
public ReturnDataForLayui getList(BlindBoxInfo blindBoxInfo) {
blindBoxInfo.setIsDeleted(PageBean.isDeletedNo);
return blindBoxInfoService.getList(blindBoxInfo);
}
@MustSetForOrderNoAnnotation
@AuthenticationAnnotation
@RequestMapping("/add")
@ResponseBody
public ReturnData add(BlindBoxInfo blindBoxInfo) {
return blindBoxInfoService.add(blindBoxInfo);
}
@Controller
@RequestMapping("/goodsInfo")
public class GoodsInfoController extends BaseController {
@Resource
private GoodsInfoService goodsInfoService;
@MustSetForOrderNoAnnotation
@AuthenticationAnnotation
@SetMenuAnnotation
@RequestMapping("listPage")
public ModelAndView listPage(ModelAndView modelAndView, Long blindId) {
modelAndView.setViewName("goodsInfo/list");
modelAndView.addObject("blindId", blindId);
return modelAndView;
}
@MustSetForOrderNoAnnotation
@AuthenticationAnnotation
@RequestMapping("addPage")
public ModelAndView addPage(ModelAndView modelAndView, Long blindId) {
modelAndView.addObject("blindId", blindId);
modelAndView.setViewName("goodsInfo/add");
return modelAndView;
}
@MustSetForOrderNoAnnotation
@AuthenticationAnnotation
@RequestMapping("editPage")
public ModelAndView editPage(ModelAndView modelAndView, Long id) {
modelAndView.addObject("id", id);
modelAndView.setViewName("goodsInfo/edit");
return modelAndView;
}
@MustSetForOrderNoAnnotation
@AuthenticationAnnotation
@RequestMapping("/getList")
@ResponseBody
public ReturnDataForLayui getList(GoodsInfo goodsInfo) {
goodsInfo.setIsDeleted(PageBean.isDeletedNo);
return goodsInfoService.getList(goodsInfo);
}
@MustSetForOrderNoAnnotation
@AuthenticationAnnotation
@RequestMapping("/add")
@ResponseBody
public ReturnData add(GoodsInfo goodsInfo) {
return goodsInfoService.add(goodsInfo);
}
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for address_info
-- ----------------------------
DROP TABLE IF EXISTS `address_info`;
CREATE TABLE `address_info` (
`id` bigint(19) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键id',
`person_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '姓名',
`phone` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '电话',
`gender` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '性别',
`address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '地址',
`user_id` bigint(19) NOT NULL COMMENT '用户',
`is_deleted` char(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '是否删除',
`gmt_create` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
`gmt_update` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '收货地址信息' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of address_info
-- ----------------------------
INSERT INTO `address_info` VALUES (1, 'zhy', '18034272031', '2', '河北省 衡水市', 1, '0', '2021-09-08 14:39:49', '2021-09-08 15:37:20');
INSERT INTO `address_info` VALUES (2, '张红雨', '18034272031', '2', '北京市 海淀区 中央电视台大楼对面 富尔大厦 3008', 1, '0', '2021-09-08 15:21:00', '2021-09-08 15:37:00');
-- ----------------------------
-- Table structure for blind_box_info
-- ----------------------------
DROP TABLE IF EXISTS `blind_box_info`;
CREATE TABLE `blind_box_info` (
`id` bigint(19) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键id',
`title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '标题',
`description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '描述',
`price` bigint(19) NOT NULL COMMENT '单价',
`sort` int(9) NOT NULL COMMENT '排序',
`is_on_sale` char(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '是否上架',
`goods_level` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '概率',
`is_deleted` char(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '是否删除',
`gmt_create` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
`gmt_update` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '盲盒信息' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of blind_box_info
-- ----------------------------
INSERT INTO `blind_box_info` VALUES (1, '擎天柱重装上阵', '变形金刚变身“咔咔咔咔咔咔”', 1, 0, '1', '{\"id\":1,\"level1\":25,\"level2\":25,\"level3\":25,\"level4\":25}', '0', '2021-09-02 17:21:15', '2021-09-19 13:30:47');
INSERT INTO `blind_box_info` VALUES (2, '苹果iPhone纯享', '苹果手机笔记本平板主机耳机', 1, 0, '1', '{\"id\":2,\"level1\":0.01,\"level2\":0.01,\"level3\":0.01,\"level4\":99.97}', '0', '2021-09-02 17:35:39', '2021-09-19 13:30:48');
INSERT INTO `blind_box_info` VALUES (3, '燃烧生命吧!你的可能性是无限可能,无所不能', '概率所得限量真骨雕新品!', 11, 1, '1', '{\"id\":3,\"level1\":0.01,\"level2\":0.02,\"level3\":0.03,\"level4\":99.94}', '0', '2021-09-02 17:53:36', '2021-09-12 21:44:13');
INSERT INTO `blind_box_info` VALUES (4, '111', '111', 1100, 1, '1', '{\"id\":null,\"level1\":25,\"level2\":25,\"level3\":25,\"level4\":25}', '0', '2021-09-19 13:32:10', '2021-09-19 13:32:27');
-- ----------------------------
-- Table structure for file_upload_info
-- ----------------------------
DROP TABLE IF EXISTS `file_upload_info`;
CREATE TABLE `file_upload_info` (
`id` bigint(19) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键id',
`path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '路径',
`file_size` bigint(19) NULL DEFAULT NULL COMMENT '大小',
`data_from` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '来源',
`is_deleted` char(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '是否删除',
`gmt_create` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
`gmt_update` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 102 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '文件上传信息' ROW_FORMAT = Dynamic;
-- ----------------------------
要说什么市场最大?
老人要健康,女人要美丽,男人要赚钱!
客户目标客户就是女人,产品是化妆产品,而且是高端化妆产品。

我老婆经常用的化妆品,特意去某东上搜索了下,一小瓶化妆水就是一双球鞋的钱,我好心疼,nnd,我一双球鞋,已经穿7年了。看到销量我裂开了。
一个月过亿。
客户的这次选择的市场绝对是没有问题的,而且游戏很好玩。我原来玩过CF的抽奖游戏,不知道玩了多少轮。
所以客户给我说,他们第一轮要融资2000w,如果搞起来真的有戏。
化妆品的市场太大了。
对了,如果您要找我开发,我要声明以下:
我们对市场一点不感冒,我们只是开发!所以你找我开发,我不加入你的合伙,我只是开发,也不用给我画饼。给我开发的费用即可。
说白了,就想让我免费开发,隔三差五的总有人给我画饼,对不起,我胃最近不好,消化不了大饼。

不过创业的风险很大。我前面接了了很多开发的活,在众多创业的产品中,只有一个人成功了。
给一个留学生做的一个中文交友的网站。
天时、地利、人和,就突然火了,一年利润达到了500w。
其他的99%开发的产品,大部分都gg了。
有的产品的idea很好,市场也很好,但是推广需要极大的费用。一般人是玩不起的。
最惨的一个老板,我们给他开发了一个劳务市场的APP,市场巨大。老板满怀希望的砸了300w推广费,开发费用给我们砸了20w。
不幸的是,最后钱全打水漂了。
最后调查了很久的原因,让老板很郁闷:
农民工兄弟,一般不喜欢用app。如果使用的流程复杂,更不会用。而且推广需要不断的砸钱。
老板直接喷血……
有好的idea,我们可以开发,但是,但是……
成功的产品需要运气,更需要资本的注入,需要快速占领。
阿里也过做社交软件,腾讯也做过电子商城,抖音很火,腾讯从微视到视频号………
成功的产品需要天时、地利、人和,缺一不可。
总的来说,产品够不够硬,只有投放到市场,让用户体验才是王道。至于其他的什么idea有时候就是扯淡。
我是小孟,分享各种项目经验和面试资料。
一起加油进步。
求个三连,点赞,收藏,更多干货的更新ing:

如果也想学习小程序的开发,我录制了一个详细的教程,下面领取。回复:小程序实战
👇🏻 教程可通过搜索下方 公众号 获取👇🏻
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
前言一般来说,前端根据后台返回code码展示对应内容只需要在前台判断code值展示对应的内容即可,但要是匹配的code码比较多或者多个页面用到时,为了便于后期维护,后台就会使用字典表让前端匹配,下面我将在微信小程序中通过wxs的方法实现这个操作。为什么要使用wxs?{{method(a,b)}}可以看到,上述代码是一个调用方法传值的操作,在vue中很常见,多用于数据之间的转换,但由于微信小程序诸多限制的原因,你并不能优雅的这样操作,可能有人会说,为什么不用if判断实现呢?但是if判断的局限性在于如果存在数据量过大时,大量重复性操作和if判断会让你的代码显得异常冗余。wxswxs相当于是一个独立
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
@作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors 1、什么是behaviors 2、behaviors的工作方式 3、创建behavior 4、导入并使用behavior 5、behavior中所有可用的节点 6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors 1、什么是behaviorsbehaviors是小程序中,用于实现