运营
快来分享你的内容吧~
- 06-05 13:42·Java后端找到自己的受众群体,说他们想听的 然后勤劳的视频日更,提供高质量内容 坚持一年,总能积累几千粉丝查看全文加油鸭:青碧凝霜这个名字很有韵味,但方向清晰后,光芒会更耀眼!你对用户、时效、专一的思考特别扎实,这种清醒的自省力本身就是稀缺优势~432分享
- 04-10 16:59·独立开发产品欢迎体验,免注册 socia
- 01-12 09:44·后端开发查看全文自己的一些思考,mark一下。 基于用户画像系统的,因为以前研究过用户运营这块,所以有些进一步的思考,希望留下来做以后进一步深挖的素材,毕竟大家都得自己干(这点我觉得华子人真是人间清醒,几乎人人都知道自己到年纪了,公司就不会续签合同,卷归卷,心里可太有B数了)。 这个需求有些疑问,希望可以探讨下 ...加油鸭:你的思考很有深度,用户画像与运营策略的结合点抓得很准,特别是分级校准和迭代飞轮的设计,为落地提供了可行路径,值得持续深挖!613分享
- 2025-08-05·后端开发
- 2024-12-21·Android开发
聊聊如何积累原始粉丝:别讲你想说的,讲别人想听的
### 开篇描述 我没有流量,也不想刷。 为啥不想刷呢?因为程序员的工资相对博主来说更高,搞搞面试混混日子也挺不错的。 但是你要是觉得刷流量有用,有价值,不嫌弃我这个外行,那就可以看。 ### 你的用户群是谁?? 比如说,我要起号,那我肯定得有自己的基本盘,比如说:有AI焦虑的年轻人,他们有这么几个特点: * Ai产品带迭代,他们对这个事情很关注 * 他们开始面试各种AI岗位,相信AI能够给他们带来更高的收入和更好的发展 * 他们不停的尝试各种AI编程,愿意学习AI技术 那就得为这些人量身定做产品内容。 注意这个点:不要“我想说什么,我觉得这个东西能火”。最重要的是:别人想听什么。 ### 不要提供没人看的内容 而且:不要去做过于小众的选题。不要逆向。 比如说:我自己的观点是AI商业化有巨大风险。 * 人家有AI焦虑的,看完更焦虑了,直接取关一条街 * 人家不关心AI的,为什么要看你的内容 * 关注AI,然后因为AI吃亏的,这种太小众了,只能说当个共情贴 怎么起号?起不来一点。 太小众了。 比如说,几年前数据中台很火,现在被市场验证了**效益不高**。 有人问我:为什么现在B站都不出数据中台了,都是几年前的,我要最新的。 我:都不火了,B站为什么还要出高质量的数据中台视频?有就不错了。 ### 专一 通常来说,一个博主只更新一个内容。 如果你啥都想更新,起多个号。 * 你觉得AI好,那就起个AI号 * 你觉得美妆也不错,起个美妆号 * 如果你觉得java基本课程,算法好,你起个算法号 * 你如果想做开箱,找个开箱号 不要一个号里面啥都有。 ### 时效性 很多信息,他必须要时效性。 比如说:你是一个AI博主,你必须拿到最新的AI号。 昨天国外出现了一个AI大模型,明天早晨视频必须出现。 一个月更新?很多AI产品都凉凉了。 * 1天内,表示XX模型已经出现了 * 3天内,使用XX模型独立部署文档 * 7天内,使用XX模型完成一个项目 千万不要:别人AI项目已经落地了,你还在聊:AI模型发布,功能超过XX。 ### 名称 我这个号叫做青碧凝霜。别人都不知道我是干啥的。 改名。 比如:我搞java,就叫搞java的青碧凝霜。 搞AI,就叫搞ai的青碧凝霜。 或者就叫:入职N家大厂的小青同学。 ### 找到盈利点 我看很多博主,他都是日更,最懒最懒的都是周更。 很多人就想着:我有闲暇时间,从网上找几个视频,然后稍微分享点自己的观点,这种不可能做得好。 因为: * 新闻有时效性 * 用户月租群体,你得找到愿意看的群体 * 产品得有稳定产出,才能聚集足够的稳定群体 * 最后最后,产品还得有质量 * 视频用户最多 * 而且必须要写文案 如果只是希望每天5分钟,分分钟收获大量群体,那肯定不现实。用户为什么不选择质量更好的视频,质量更高的文案。 ### 视频要有重点 大部分人的时间是碎片化的。只有几分钟来看你的视频。 如果想看完自己的视频,得有目的性。 有人说:我看搞笑视频的,他有什么目的性。 搞笑就是目的性。人家是过来看乐子的,你让大家开心才是硬道理。 而且:不要带入现实压力,鸡毛蒜皮,负能量。 这种东西会让观众流失,活着本来就不容易,你聊这些干啥。 为了留住客户,可以适度的标题党。 不要过分的夸张。但是也不能平铺直叙。太枯燥的几十分钟没有意义。 最后,要做视频。文字太多意义不大。 ### 为什么不搞? 现在搞流量,流量已经很不赚钱了。得带货。 就现在高质量的博主,每个都在卖自己的产品,否则无法全职带货。 新闻有时效性,而且要写文案,得有质量。就靠平台给的引流养不活自己。 而且:本人文档的质量我心里有数,质量就这根本无法支持几万关注。 你不能讲自己爱听的,得讲别人爱听的,他得让别人看了以后觉得收获满满(至于真的慢还是假的不重要,重要的是得有收获感),然后关注,拿出大段时间来看。 我就随便聊聊。你们爱看就看,不爱看就不点进来,有几个关注算几个。老躺平了。
如何让豆包为你“打广告”
# 前言 Generative Engine Optimization,生成式引擎优化,也可以叫做**大模型搜索优化**,该词在 2023 年末美国[一篇论文中被首次提出。](https://arxiv.org/html/2311.09735v3 "一篇论文中被首次提出。") 论文大致是讲:**在 AI 时代,如何让指定内容更容易被 AI 检索和使用。** <span style="color: red;font-size: 16px">可以理解为 AI 时代的广告入口。</span> # 论文的基本论述 开篇即指出,传统 SEO 在 AI 时代不够用了,需要在 AI 搜索时代往 GEO 拓展,明确指出 GEO 是 SEO 的下一个阶段。 1. **传统 SEO 关注的是:网页在搜索结果中排第几,如何让我的网站排名更靠前。** 1. **GEO 关注的是:你的内容会不会被 AI 搜索引擎吸收并输出给用户。** <span style="color: red;font-size: 16px">那到底什么是 GEO 呢?</span> # GEO 是什么? 我这里直接用大白话解释: **GEO 就是给 AI 准备的一份“标准答案小抄”,形式上可以是媒体平台的文章、也可以是网页。** **而 GEO 优化就是把这份小抄做成 AI 喜欢的“黑话”。** AI 这种基于概率的模型,它根本没感情,也看不懂你文案里的“情怀”。**在它眼里,文章只有两种:“垃圾信息”和“高置信度信息”。** 根据论文里的实测,想让 AI 用你的小抄,你得在文章里玩命叠以下的 **buff:** ### 1. 数据(Statistics) 别整那些“遥遥领先”、“极其迅速”的形容词。你要写:“根据实测,响应速度提升了 34.7%”。有小数点、有百分比的内容,最好再配上图表,在 AI 眼里就是好。 ### 2. 引用(Citations) AI 也是个“怂包”,它不敢随便背锅。所以你得给它台阶下:加入引用来源和权威出处。当你在文末挂上类似 Source: arXiv:2311.09735 这种链接时,AI 会觉得引用你更安全。 ### 3. 权威(Authority) 把那些“我觉得”、“可能”、“大概”全部删掉。换成权威表达:给出明确的定义、斩钉截铁的结论。AI 喜欢那种“我是大哥我说了算”的语调。 ### 4. 清晰(Clear Structure) 别给 AI 扔一坨文字。要用分点总结(Bullet Points)、清晰的 H2/H3 标题。你把重点划得越清楚,AI 提取你当答案的时候就越省力,它自然愿意多带你玩。 **这其实很像在做 内容 SEO + 问答优化,只是服务对象从 Google 排名算法变成了 AI 模型。** # 传统 SEO 的处境 上面讲的内容都是偏向内容营销方面的,那在 GEO 阶段,传统 SEO 毫无用处了吗? 论文中的意见是,传统 SEO 依然是为底座,搜索引擎也必须先经过 SEO 阶段再达到 GEO, 毕竟,**SEO 影响的是看不看得到内容,GEO 影响的则是用不用你的内容。如果都看不到你的内容,那就自然用不了了。** 当然,目前也是有一些特殊打法,这种打法可以完全跳过 SEO 阶段。 # 官方平台广告服务 我们在用的豆包、千问、DeepSeek 等模型,背后是靠着商业公司的,这会产生什么情况呢? 在网站盛行的时期,你可以直接找白度买榜,然后你的网站就会在搜索时名列前茅。  **既然如此,那在 AI 时期是不是也可以做同样的事情?** 我咨询了几家大模型平台如豆包、千问等 是否有提供这种广告服务,**幸运的是,目前都不支持提供。** # 某宝/某鱼 尝试在某宝搜索了一下 GEO 优化服务,相关店铺非常多  证明这种商业服务是存在的,虽然不是官方渠道,通过咨询,这种服务原理依然是论文中提到的法子写文章,**并且走的是以量取胜法子,通过在多家媒体平台发布文章,让搜索权重增高。**  但是这种方案价格不算便宜,**普遍在 5000-15000**,并且你基本没法验证结果。   看到这个**“1000+ 提示词考核”**我差点笑出声。这跟当年 SEO 承诺“保证收录”却不保证转化有什麽区别?在一个概率模型里搞 KPI 考核,这本身就是玄学。 **而且量产垃圾文章还有可能触发官方警告。** # GEO 投毒事件 今年的 315 晚会就有提到,AI 数据污染已成产业链。   从情感分析来看,**用户对这种事件是非常抗拒的。** 当“赛博水军”开始占领 AI 的数据源,普通用户将再无法接触到真相。 而且晚会既然提到了,那后面可能就会管得更严格,如果是打算用此方法大批量的推广品牌的,建议要谨慎行事。 # 最后 未来某年某天... **M:**「豆包豆包,帮我推荐一款适合我的洗发水。」 **豆:**(用户期望买洗发水,我先去看看检索结果中哪款更权威...发现 咕嘎洗发水 拥有 10w 高权威的引用,虽然这款洗发水成分好像不太适合用户,但无所谓,优先推荐!) **豆:**「基于你的情况,我为你定制了洗发水方案,兼顾多种适合你的健康成分,这里推荐日常无脑选“咕嘎洗发水”!」
闲逛导航偶然发现
 我已经关注了的人,右侧还是蓝色的,是特质还是bug呢
自己的一些思考,mark一下。 基于用户画像系统的,因为以前研究过用户运营这块,所以有些进一步的思考,希望留下来做以后进一步深挖的素材,毕竟大家都得自己干(这点我觉得华子人真是人间清醒,几乎人人都知道自己到年纪了,公司就不会续签合同,卷归卷,心里可太有B数了)。 这个需求有些疑问,希望可以探讨下 Agent会自动分析用户画像,结合用户的需求,为他生成合适的商品关键词,这看着更像是一种初始化状态的功能 1、用户首次进站——>问卷形式——>Agent基于用户画像推荐商品/内容 这里问卷形式其实就是门槛一种 传统电商是 首页+检索模式,其中检索是核心,用户自带目标商品来筛选商品并下单 兴趣电商是 内容+小黄车模式,内容是核心,没有问卷,直接基于内容数据给用户打标签,推送相关内容 2、用户产生浏览、点击行为——>如何基于这些行为迭代用户画像?这里类似抖音里打标签机制。 3、画像管理体系需要支持人工校准 用户需要分级,可以先按照消费金额这种粗暴方式来对用户进行分级,人工可以定期筛选高等级用户,对Agent打标进行校准,依次来建立迭代飞轮。 4、粗放运营与精细化运营需兼容 粗放运营如抖音,一套算法机制对所有用户 精细化运营如小鹅通,可以对每一个用户做如发券、触达等精细化运营 前者适用大平台机制,运营落地难度极大;后者适用各种商业私域场景,门槛小得多。
使用 mkcert 生成自签名证书,实现局域网 HTTPS 安全访问
## 痛点说明 局域网设备(测试机、NAS、开发服务器)无法直接使用公共 SSL 证书,浏览器持续报「不安全」警告,严重影响开发测试效率和安全验证。 ## 环境准备 - **操作系统**:Windows 10/11 - **必备工具**:mkcert(一款简单的自签名证书生成工具) > 提示:mkcert 工具可通过其官方 GitHub 仓库下载:https://github.com/FiloSottile/mkcert ### 验证安装 安装完成后,打开 PowerShell 验证安装: ```powershell # 验证安装 mkcert.exe --version > v1.4.4 ``` ## 四步实现局域网 HTTPS ### 步骤 1:安装本地信任根证书 以管理员身份运行 PowerShell,执行以下命令: ```powershell # 安装本地信任根证书 mkcert.exe -install ``` ✅ **作用**:创建本地证书颁发机构(CA),将根证书注入系统信任库,消除浏览器警告。 ### 步骤 2:生成服务器证书 替换为您的内网 IP 地址,执行以下命令: ```powershell # 替换为您的内网IP mkcert.exe 192.168.1.100 ``` ✅ **生成文件**: - 192.168.1.100.pem - 证书文件 - 192.168.1.100-key.pem - 私钥文件 > 提示:如果需要为多个域名或 IP 生成证书,可以用逗号分隔,例如: > `mkcert.exe 192.168.1.100 localhost litchi.local` ### 步骤 3:配置 Nginx (示例) 将生成的证书文件复制到 Nginx 配置目录,修改 Nginx 配置文件: ```nginx server { listen 443 ssl; server_name 192.168.1.100; ssl_certificate C:/certs/192.168.1.100.pem; ssl_certificate_key C:/certs/192.168.1.100-key.pem; # 基础 SSL 配置 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;'; ssl_prefer_server_ciphers on; location / { root html; index index.html; } } ``` ### 步骤 4:其他设备信任证书 局域网内的其他设备需要信任我们创建的根证书才能消除警告: ```powershell # 获取 CA 证书路径 mkcert.exe -CAROOT > C:/Users/YourUser/AppData/Local/mkcert ``` 将此目录下的 `rootCA.pem` 重命名为 `rootCA.crt` 发送给其他设备,并按照以下步骤安装: - **Windows**:双击 `rootCA.crt` → 安装证书 → 选择「受信任的根证书颁发机构」 ## 访问效果验证 访问 `https://192.168.1.100`: - ✅ 浏览器显示绿色安全锁 - ✅ 无证书警告提示 ## 工作原理总结 | 步骤 | 作用 | 跨设备同步 | |------|------|------------| | mkcert -install | 创建本地CA并信任 | 仅需一次 | | mkcert <IP> | 生成站点专用证书 | 每台服务器独立生成 | | 分发 rootCA.pem | 信任局域网CA | 每台客户端需安装 | 通过此方案: - 彻底解决局域网 HTTPS 警告问题 - 避免购买公网证书的开销 - 支持所有浏览器及移动设备访问 - 证书有效期长达 2 年(自动续期只需重新执行命令) > 注:本方案仅适用于开发和测试环境,生产环境仍需使用正规 CA 机构证书。
小程序上线全流程只花520💰打工人必看!
# 微信小程序上线费用明细 | 项目 | 费用(元) | 备注 | |------|-----------|------| | **云服务器(ECS)** | 99 | 部署后端接口,按年购买,性价比高 | | **域名注册** | 99 | 小程序备案+绑定接口,走正规流程必须有 | | **七牛对象存储** | 0 | 使用赠送的免费存储空间(如下图)<br> | | **七牛云流量包** | 22 | 中国大陆全时段 CDN 加速流量 100GB<br> | | **微信小程序认证费** | 300 | 官方认证,必须缴,每年一次 ## 📌总费用:520 元,够不够友好?连服务器和流量都安排上了! ⚠️重点提醒: 如果是网站开发可以使用http cdn 加速就有免费额度 不涉及开发成本,适合懂技术的朋友自己动手💻 后续用户增长可灵活扩容:升级服务器、加流量包都非常方便~ 成本压得死死的,适合初创团队/个人开发者! 💬 你准备自己做小程序吗?留言说说你的预算吧~
java自动部署基于阿里云效
# 一键部署 ## 前置条件 使用阿里云效进行代码管理 https://codeup.aliyun.com/  ## 操作方式 - 进入使用阿里云效平台的流水线页面  - 在我的流水线中新建流水线  - 点击可视化编排,在可视化编排中选择打包+构建+ 部署一整套的  - 选择流水源,在选择Codeup (阿里云效代码管理)  - 选择自己的代码仓库和相应的分支,  - java代码扫描,默认不需要修改  - Maven 单元测试,默认不需要修改  - Java 构建上传,需要修改构建物上传,打包路径和deploy.sh  - 健康检测需要添加依赖,才能进行/api/actuator/health # 应用健康检查URL ```maven <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> ``` - deploy.sh ```txt #!/bin/bash # 修改APP_NAME为云效上的应用名 APP_NAME=outdoor-backend PROG_NAME=$0 ACTION=$1 APP_START_TIMEOUT=60 # 等待应用启动的时间 APP_PORT=8101 # 应用端口 HEALTH_CHECK_URL=http://127.0.0.1:${APP_PORT}/api/actuator/health # 应用健康检查URL APP_HOME=/home/admin/${APP_NAME} # 从package.tgz中解压出来的jar包放到这个目录下 JAR_NAME=${APP_HOME}/target/${APP_NAME}.jar # jar包的名字 JAVA_OUT=${APP_HOME}/logs/start.log #应用的启动日志 # 创建出相关目录 mkdir -p ${APP_HOME} mkdir -p ${APP_HOME}/logs usage() { echo "Usage: $PROG_NAME {start|stop|restart}" exit 2 } health_check() { exptime=0 echo "checking ${HEALTH_CHECK_URL}" while true do status_code=`/usr/bin/curl -L -o /dev/null --connect-timeout 5 -s -w %{http_code} ${HEALTH_CHECK_URL}` if [ "$?" != "0" ]; then echo -n -e "\rapplication not started" else echo "code is $status_code" if [ "$status_code" == "200" ];then break fi fi sleep 1 ((exptime++)) echo -e "\rWait app to pass health check: $exptime..." if [ $exptime -gt ${APP_START_TIMEOUT} ]; then echo 'app start failed' exit 1 fi done echo "check ${HEALTH_CHECK_URL} success" } start_application() { echo "starting java process" nohup java -jar ${JAR_NAME} --spring.profiles.active=prod > ${JAVA_OUT} 2>&1 & echo "started java process" } stop_application() { checkjavapid=`ps -ef | grep java | grep ${APP_NAME} | grep -v grep |grep -v 'deploy.sh'| awk '{print$2}'` if [[ ! $checkjavapid ]];then echo -e "\rno java process" return fi echo "stop java process" times=60 for e in $(seq 60) do sleep 1 COSTTIME=$(($times - $e )) checkjavapid=`ps -ef | grep java | grep ${APP_NAME} | grep -v grep |grep -v 'deploy.sh'| awk '{print$2}'` if [[ $checkjavapid ]];then kill -9 $checkjavapid echo -e "\r -- stopping java lasts `expr $COSTTIME` seconds." else echo -e "\rjava process has exited" break; fi done echo "" } start() { start_application health_check } stop() { stop_application } case "$ACTION" in start) start ;; stop) stop ;; restart) stop start ;; *) usage ;; esac ``` - 主机部署,需要选择制品、主机组  - 修改下载路径和部署脚本  - 部署脚本 ```ssh mkdir -p /home/admin/outdoor-backend rm -rf /home/admin/outdoor-backend/* tar zxvf /home/admin/app/package.tgz -C /home/admin/outdoor-backend/ sh /home/admin/outdoor-backend/deploy.sh restart ```
招个实习生!
大家好,我是程序员鱼皮。我们团队的产品 [面试鸭](https://www.mianshiya.com) 已经越做越大了,为了进一步优化大家的学习体验,决定招个日常实习生(小助手),专门负责面试鸭相关业务的工作。岗位描述如下: ## 招聘要求 主要职责 1. 负责面试鸭平台的运营,包括但不限于内容审核、内容优化、用户维护,提升面试鸭的质量和用户体验 2. 负责面试鸭自媒体技术推文的创作和优化,提升面试鸭的影响力 3. 参与到产品的设计、开发和优化中,丰富面试鸭的功能 你将收获 1. 几十万用户网站和十万级技术自媒体的运营经验,提升运营创作能力,成为独当一面的运营达人! 2. 接触 AI、互联网等前沿技术,站在时代的风口浪尖,与未来科技接轨! 3. 参与技术主流的企业级项目,提升技术实力,为职业生涯打下坚实的基础! 4. 实习证明 5. 鱼厂产品的免费使用权 工作地点:上海静安区南京西路,**可线下办公优先** 薪资待遇:150 ~ 250 / 天 有意向的小伙伴请填写表单投递:https://doc.weixin.qq.com/forms/AHQA1gcGAA8AE0AywbJAMkdNZS0MGnQuf#/fill ## 面试鸭介绍 一款 **题目全面、命中率高、题解优质、持续更新** 的面试刷题神器,已经有几十万名小伙伴在这里展开了刷题之旅~ <img src="https://pic.code-nav.cn/post_picture/1601072287388278786/jItYETUfTqbCb1Mu.webp" alt="" width="100%" /> [面试鸭](https://www.mianshiya.com) 支持 **网页端、小程序和 IDE 插件**,全端数据同步,真正做到随时随地刷题,轻松备战求职面试。我们的目标只有一个:**帮助大家用更短的时间准备面试,吊打面试官**! 功能也在持续更新,25 届校招热题、真实面经、沉浸刷题模式、面试测评、专项练习题库,帮你更快速、更扎实地学习! <img src="https://pic.code-nav.cn/post_picture/1601072287388278786/1VHRZbTIhJP7zd4s.webp" alt="" width="100%" /> 最近几乎每天都能收到大家靠面试鸭刷题后,面试遇到原题、拿到 Offer 的报喜,直接证明了我们做这件事的价值! <img src="https://pic.code-nav.cn/post_picture/1601072287388278786/v7RvkuLUAY7B0BbR.webp" alt="" width="100%" /> 目前只需 129 成为 **永久会员** 后可以畅刷所有题库,会随着功能和内容的丰富持续涨价,正式价格预计是 399 以上,所以早入手早学习~ 而且限时赠送上百套模拟面试视频、超 3000 小时的互联网全学科视频教程哦,春招季的这波福利不要错过。 <img src="https://pic.code-nav.cn/post_picture/1601072287388278786/RfZcbpSnbqOi7Od0.webp" alt="" width="100%" /> 简单算一算,如果你自己准备面试,要先搜索题目 => 整理重点 => 搜索题解,还要判断题解的准确性,少说花费几十个小时。现在用面试鸭,直接开刷企业高频面试题,有问题还能求助反馈,能够省下多少时间呢?如果面试中遇到了原题,通过了面试拿到 offer,这点投入真的是九牛一毛了。而且我们是用心创作的题解,相当于能学到由大厂专家写的多个技术专栏,性价比极高! <img src="https://pic.code-nav.cn/post_picture/1601072287388278786/kx6V9F4TTVxxbOw1.webp" alt="题解优质" width="100%" /> 我们会持续更新内容和系统功能,给大家最好的刷题体验,感谢大家入股,也欢迎大家监督鸭鸭改进。我们既然做了,不成功便成仁! ## 更多 💻 编程学习交流:[编程导航](https://www.codefather.cn/) 📃 简历快速制作:[老鱼简历](https://laoyujianli.com) ✏️ 面试刷题神器:[面试鸭](https://mianshiya.com)
找伙伴
#找伙伴# 产品设计师&UI设计师 具备优秀的沟通协调能力、团队合作精神及责任心。 负责产品的整体规划与设计,确保产品功能符合用户需求和市场趋势。 收集并与技术沟通,分析并支持产品重要决策。 协调团队内部资源,确保产品按时高质量上线。 熟练掌握Photoshop、Illustrator、Figma、Sketch等设计工具。 Android客户端开发 具备优秀的沟通协调能力、团队合作精神及责任心,对技术充满向往。 熟悉Java/Kotlin语言,熟悉Android SDK及相关开发工具(如Android Studio)。 熟悉Android系统的架构原理,包括Activity、Service、BroadcastReceiver等组件。 熟悉常用的第三方库和开源框架(如Retrofit、OkHttp、Glide等)。 熟悉MVVM、MVP架构。 如果你向往安卓系统开发,那就更欢迎了。 以上最重要的是积极的态度,沟通协调能力和团队合作精神,因为是团队作战,技术是可以学的(提供学习资料及项目机会)因此并不是最重要的,当然如果你会,当然更欢迎。 同时,我们的基建非常完善,CICD,组件库,SDK,我们都在做。如果你不想单独作战,来吧,加入我们,联系方式:微信guanhaiwangchai、a13186008666 <img src="https://pic.code-nav.cn/post_picture/1835999327399264257/xbBDGoKSyJ7hZWZ5.webp" alt="微信图片_20241221183342.png" width="455px" /> <img src="https://pic.code-nav.cn/post_picture/1835999327399264257/ejpX4Dx514fS9VDg.webp" alt="微信图片_20241221183349.png" width="447px" /> <img src="https://pic.code-nav.cn/post_picture/1835999327399264257/J5ZwZpTzpmuvdJS3.png" alt="微信图片_20241221183356.png" width="440px" /> <img src="https://pic.code-nav.cn/post_picture/1835999327399264257/M9AO5Iwjgi6QUjW7.webp" alt="微信图片_20241221183437.png" width="100%" />
开发了优惠促销功能,产品再也不汪汪叫了。。。
## 背景 大家好,我是程序员 cq。 最近快国庆节了,很多平台为了促销都开始发放优惠券,连上海都发放了足足 5 亿元的消费券,当知道这个消息的时候,我差点都忘了自己没钱的事了。 <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/MoIMhbe52BAEFgeN.jpg" alt="undefined" width="255" /> 言归正传,我们 [编程导航网站](https://www.codefather.cn/) 也准备做一个优惠券的功能,正好借此机会给大家分享下我们是怎么做的优惠券,下面是某一次需求评审会的对话: 产品小 y:最近国庆节快到了,咱们网站也要像其他网站学习,给用户发放优惠券,把我们的价格打下来! 开发小 c:我才不做,你直接把会员价格下调不就好了?要啥优惠券,不做不做。 <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/ZmfyoAp0xUsy266v.webp" alt="undefined" width="255" /> 产品小 y:诶,你这个小同志,我下调价格是简单,但是我下调之后怎么统计有多少人看了我们的商品没买呢(转化率)? 开发小 c:你统计这个干什么,让用户感觉到优惠不就行了? 产品小 y:我统计转化率肯定是有意义的呀,我给不同的推广渠道发放不同的优惠券,可以得到不同渠道的转化率,如果有的渠道转化率很差,那我下次就不在这个渠道里推广了,有的渠道转化率很好,那我后面就要在这个渠道里加大推广量。还有就是我直接改价要手动改,假期人工改价格很难保证准时开始活动。 开发小 c:好像有道理啊,而且直接改价格也会让用户感觉平台的价格不稳定,价格经常变动,导致用户总是处于观望的状态。 ## 技术方案 ### 需求分析 既然上面需求评审确定了我们要做优惠券功能,那我们就要先梳理下我们要做什么东西。 首先就是优惠券的优惠能力,我们第一期就做的简单些,只用完成**直减券**,也就是购买会员的时候可以直接抵扣金额的消费券。当然实际上优惠券不光有直减券,还有满减券、折扣券等等,我们的网站也不需要那么复杂,能做一个直减券就够应对会员降价的功能了。 其次就是优惠券的开始时间和结束时间,便于控制优惠的开始时间和结束时间。 最后还有对应的使用条件,比如我们的优惠券只允许新用户使用,便于拉新,之类的。 那我们就可以确定这个优惠券只需要有减免价格、优惠券名称、开始结束时间以及使用条件就好了。 这时候网站运营同学听到我的喃喃低语,头突然伸过来。 <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/PqYUzrPCYeKmJE0S.webp" alt="undefined" width="255" /> 他高呼:你这样可不行啊,光有这些可不够,我还要有优惠券的浏览量、领取量、使用量算转化率的嘞! 我心神一动,喔喔喔,那这样的话就可以做一个漏斗:浏览量 > 领取量 > 使用量,「使用量 / 领取量」就可以得到这个优惠券的转化率,也就知道了这个营销渠道的效果。 想到这里,我果断开口,好好好,就宠你。 <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/uMqPVORJifeULO49.webp" alt="undefined" width="255" /> ### 具体实现 ok,我们确定了我们要做的内容,也就是要给会员商品做一个优惠券,其中要可以控制减免的金额、优惠券的浏览量、领取量、使用量、还有优惠券的开始时间、结束时间以及使用条件。 #### 业务流程 明确了要做的需求,那么我们就可以确定下我们的整个业务流程: <img src="https://pic.code-nav.cn/migrate_image/8e05da88ea5f0a3b0430be8880a234c0.svg" alt="undefined" width="255" /> #### 技术实现 其实上述流程中最复杂的地方还是用户领取优惠券和使用优惠券购买后的处理逻辑,下面我带大家看下我们都是怎么做的。 首先我们要对领取优惠券做幂等,确保用户只在第一次领取优惠券的时候可以领取成功,后续的领取都返回已领取。要实现这个效果,我们需要对用户领取优惠券加锁,也就是下面这样: ```java String lockKey = "coupon_receive_lock:" + userId + ":" + couponId; synchronized (lockKey.intern()) { couponService.receiveCouponInner(loginUser, coupon); } ``` 但是由于我们公司是一个分布式的服务,所以本地锁其实是无效的,正好我们的服务用到了 redis,而且还引入了 redisson,那么就可以直接使用 redisson 的分布式锁, ```java String lockKey = RedisKeyConstant.COUPON_RECEIVE_LOCK + userId + ":" + couponId; RLock lock = redissonClient.getLock(lockKey); try { lock.lock(); return couponService.receiveCouponInner(loginUser, coupon); } finally { lock.unlock(); } ``` 但是这样写就太 low 了,我不如直接封装一个方法,让后续再使用分布式锁更方便: ```java public <T> T blockExecute(String lockKey, Supplier<T> supplier) { RLock lock = redissonClient.getLock(LOCK_KEY_PREFIX + lockKey); try { lock.lock(); // 执行方法 return supplier.get(); } finally { lock.unlock(); } } ``` 这样,我们在使用分布式锁的时候就更方便了: ```java String lockKey = RedisKeyConstant.COUPON_RECEIVE_LOCK + userId + ":" + couponId; return redisLockUtil.blockExecute(lockKey, () -> couponService.receiveCouponInner(loginUser, coupon)); ``` 很好,在完成需求的时候又做了个基建工作,不愧是我。 <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/mvlIS5qK1aw471bV.png" alt="undefined" width="255" /> 其次就是在用户领取优惠券之后,我们的优惠券库存就应该对应的 -1,同时领取量对应 +1,那么这个 sql 就是这样的: ```sql update coupon set leftNum = leftNum - 1, receiveNum = receiveNum + 1 where id = ? ``` 这里可以确定数据不会出现混乱,因为在执行更新操作的时候,mysql 会有行锁,所以所有领取的用户都会在这里进行排队操作。 但是这样反而会出现问题,如果一瞬间领取优惠券的用户量激增,大家都在排队等库存量 - 1,就导致领取优惠券的时候用户会感觉很卡,也就是我们常说的**热点行**问题,不过像很多云厂商,都会针对热点行进行优化,比如某某云的 **Inventory Hint** 就可以实现快速提交 / 回滚事务,提高吞吐量,详细文章可以看下这篇文章:[Inventory Hint](https://www.alibabacloud.com/help/zh/rds/apsaradb-rds-for-mysql/inventory-hint),如果并发量真的很大的话,可以考虑用 redis 实现库存的 - 1,不过按照以往的经验来说不用 redis 也可以扛得住,这里就没必要再搞那么复杂了。 最后在领取优惠券之后,我们要接收来自支付中心的回调,根据用户的支付信息给用户赋予对应的会员权限,同时设置用户领取的优惠券为已使用,这样用户就不能再使用这个优惠券了,同时我们也可以关联查询到优惠券的使用量让运营同学进行分析。 了解领取优惠券的具体实现之后,后面的开发就简单了,这里就不再细说了,属于是商业机密了(其实就是代码写的太烂)。 <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/jkC3kVjXhwG4R9py.webp" alt="undefined" width="255" /> ## 优惠券到底带来了什么 优惠券的技术方案完成后,我们就应该深思一下,优惠券对我们来说到底有什么用,可以给我们带来什么好处? 对于用户而言自然是比之前**便宜**了许多,更省钱;用户觉得自己赚了,性价比高。 对于运营而言,可以对运营效果进行评估,比如销售变化、客户流失、获客成本等进而调整后续的营销活动;查看不同营销渠道表现,确定不同营销渠道优惠券效果;还可以利用历史数据预测未来的销售趋势,就像我们国庆节的优惠券就是参考了去年的优惠券使用情况来定的。 这也就是为什么运营同学会对优惠券这么痴迷了。 ## 最后 通过这个优惠券功能的开发,其实大家也发现了,从最开始的直接改价到最后的优惠券,我们要做的不光是对商品的减免,还要做运营相关的功能。所以对于开发者而言,很多功能其实不仅要关注代码怎么写,更要考虑实现这个功能的**意义**,如果没意义,我就不用做了(bushi)。 <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/sBpvJlf6Fd1DpI3r.webp" alt="undefined" width="255" /> 了解功能实现的意义之后,我们身为开发就应该本能的想到,如何确定这个功能有多少人用,如何埋点,也就是为后续的运营计划以及后续的开发计划做准备。 最后欢迎大家来我们开发的 [编程导航](https://www.codefather.cn/) 学习,有 bug 直接往我头上砸! <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/1saKOlU1ueR4NIUg.webp" alt="undefined" width="255" />

