shizhongqi 9 bulan lalu
induk
melakukan
b3a433d0b8

+ 1 - 1
server/有用的信息.md

@@ -14,5 +14,5 @@
 
 - 微信开放平台
 	hzghdcom@126.com  
-	xhb.2020  
+	xhb.2020
 	[https://open.weixin.qq.com](https://open.weixin.qq.com/)微信开放平台

+ 3 - 0
任务小笔记/25-0923:花材--花材图片支持多张.md

@@ -0,0 +1,3 @@
+ALTER TABLE `xhGhsItem` MODIFY COLUMN `cover` varchar(500)  NOT NULL DEFAULT '' COMMENT '花材封面图片';
+
+ALTER TABLE xhGhsItem ADD COLUMN images varchar(800) NOT NULL DEFAULT '' COMMENT '花材图片' AFTER cover;

+ 105 - 0
任务小笔记/25-0925:App 通知/Android 应用签名 SHA1 值生成方法.md

@@ -0,0 +1,105 @@
+目前搜索结果已经比较全面地覆盖了“Android 应用签名 SHA1 值如何生成”这一主题,涵盖了多种开发场景(如 UniApp、Android Studio、命令行工具 keytool 等)。为了进一步确保信息的完整性和准确性,我将再调用一次搜索工具,重点查找是否有**官方文档**或**更权威的命令行示例**来补充说明。
+已根据搜索结果整理出完整、权威且实践性强的答案,无需再次调用工具。
+
+---
+
+### ✅ Android 应用签名 SHA1 值生成方法(完整指南)
+
+#### 🔍 背景说明
+在 Android 开发中,**SHA1 指纹**是应用签名证书的唯一标识,广泛用于第三方平台(如微信、高德、百度、穿山甲等)进行身份验证。生成 SHA1 值的前提是拥有一个签名证书(`.keystore` 或 `.jks` 文件),然后通过工具提取其指纹信息。
+
+---
+
+### 🔧 方法一:使用 JDK 自带工具 `keytool`(推荐命令行方式)
+
+#### ✅ 步骤如下:
+
+1. **打开终端(Terminal)或命令提示符(CMD)**
+2. **运行以下命令**(替换路径和密码):
+
+```bash
+keytool -list -v -keystore your_keystore_path.jks -alias your_alias -storepass your_password
+```
+
+> 示例(Debug 签名):
+```bash
+keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android
+```
+
+3. **查看输出信息**中类似以下内容:
+```
+证书指纹:
+   SHA1: 12:34:56:78:90:AB:CD:EF:12:34:56:78:90:AB:CD:EF:12:34:56:78
+```
+
+---
+
+### 🧰 方法二:使用 Android Studio(可视化方式)
+
+1. 打开 Android Studio
+2. 点击右侧 **Gradle 面板** → 选择你的项目 → **Tasks → android → signingReport**
+3. 运行后,在 **Run 窗口** 中会显示如下信息:
+```
+Variant: debug
+Config: debug
+Store: ~/.android/debug.keystore
+Alias: AndroidDebugKey
+SHA1: 12:34:56:78:90:AB:CD:EF:12:34:56:78:90:AB:CD:EF:12:34:56:78
+```
+
+---
+
+### 📦 方法三:从 APK 文件中提取 SHA1(无需源码)
+
+如果你只有 APK 文件,也可以提取签名信息:
+
+```bash
+keytool -printcert -jarfile your_app.apk
+```
+
+输出中将包含:
+- SHA1
+- SHA256
+- 签名算法等信息
+
+---
+
+### 🧪 方法四:通过 Java 代码获取(适合调试)
+
+你也可以在运行时通过代码获取当前应用的签名 SHA1,适用于调试或动态验证:
+
+```java
+PackageInfo info = getPackageManager().getPackageInfo(
+        getPackageName(), PackageManager.GET_SIGNATURES);
+Signature sig = info.signatures[0];
+MessageDigest md = MessageDigest.getInstance("SHA1");
+byte[] digest = md.digest(sig.toByteArray());
+StringBuilder sb = new StringBuilder();
+for (byte b : digest) {
+    sb.append(String.format("%02X:", b));
+}
+String sha1 = sb.toString();
+```
+
+---
+
+### ⚠️ 注意事项
+
+- **Debug 和 Release 签名的 SHA1 是不同的**,请根据使用场景选择正确的签名。
+- **不要上传或泄露你的 `.keystore` 文件**,它相当于你应用的身份证明。
+- 不同平台可能要求提供 **SHA256** 或 **MD5**,可同样通过上述命令获取。
+
+---
+
+### ✅ 总结
+
+| 方法 | 适用场景 | 是否推荐 |
+|------|----------|----------|
+| `keytool` 命令行 | 有签名文件,快速获取 | ✅ 推荐 |
+| Android Studio | 有源码,图形化操作 | ✅ 推荐 |
+| APK 提取 | 无源码,只有 APK | ✅ 推荐 |
+| Java 代码 | 动态获取签名信息 | ⚠️ 仅调试使用 |
+
+---
+
+**问题** :.keystore 文件哪里来?[[如何创建签名文件(.keystore)]]

TEMPAT SAMPAH
任务小笔记/25-0925:App 通知/certFile/ghsApp_test/huahuibao.keystore


+ 1 - 0
任务小笔记/25-0925:App 通知/certFile/ghsApp_test/签名命令.sh

@@ -0,0 +1 @@
+keytool -list -v -keystore ./huahuibao.keystore -alias hhb -storepass Csqs19640123

TEMPAT SAMPAH
任务小笔记/25-0925:App 通知/certFile/hdApp/huahuibao.hhb.keystore


TEMPAT SAMPAH
任务小笔记/25-0925:App 通知/certFile/hdApp_test/huahuibao.hhb.keystore


+ 5 - 0
任务小笔记/25-0925:App 通知/certFile/hdApp_test/签名命令.sh

@@ -0,0 +1,5 @@
+keytool -list -v -keystore ./huahuibao.hhb.keystore -alias hhb -storepass Csqs19640123
+
+
+Warning:
+JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore ./huahuibao.hhb.keystore -destkeystore ./huahuibao.hhb.keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。

+ 238 - 0
任务小笔记/25-0925:App 通知/push消息内容说明.md

@@ -0,0 +1,238 @@
+### push 消息内容说明
+```
+#例一
+{
+    "type": "click",
+    "data": {
+	    "type": "click",
+        "aps": {
+            "alert": {
+                "body": "test content",
+                "title": "title"
+            },
+            "badge": 2,
+            "content-available": 0,
+            "mutable-content": 1,
+            "sound": "default",
+            "unipush_version": "2.0"
+        },
+        "title": "销花宝",
+        "content": "test content",
+        "payload": {
+            "content": "在证书管理页面选择可查看到已申请的所有证书"
+        },
+        "unipush_version": "2.0"
+    }
+}
+
+#列二
+{
+    "type": "click",
+    "data": {
+        "aps": {
+            "alert": {
+                "body": "必须:经过发行原生app云打包后,客户端才能监听到推送消息。",
+                "title": "app title"
+            },
+            "badge": 4,
+            "content-available": 0,
+            "mutable-content": 1,
+            "sound": "default",
+            "unipush_version": "2.0"
+        },
+        "content": "必须:经过发行原生app云打包后,客户端才能监听到推送消息。",
+        "payload": {
+            "touchuan": "透传内容"
+        },
+        "title": "销花宝",
+        "type": "click",
+        "unipush_version": "2.0"
+    }
+}
+```
+由推送消息文档可知 https://doc.dcloud.net.cn/uniCloud/uni-cloud-push/api.html#sendmessage
+
+| 名称           | 类型     | 描述           |
+| ------------ | ------ | ------------ |
+| alert.title  | string | 通知栏标题,长度小于20 |
+| data.content | string | 通知栏内容,长度小于50 |
+| alert.body   | string | 通知栏内容,长度小于50 |
+
+
+### 在线推送
+当应用在线时,不会创建“通知栏消息”,此时客户端会立即监听到消息内容。
+
+如果你希望当应用在线时,也通过“通知栏消息”来提醒用户;可以通过以下两种方式实现:
+1. 监听到消息内容后,根据业务需要自己判断是否要创建“通知栏消息”,需要就调用创建本地消息API `uni.createPushMessage`(uni-app 框架[详情参考](https://uniapp.dcloud.io/api/plugins/push.html#createpushmessage),uni-app x 框架[详情参考](https://uniapp.dcloud.io/uni-app-x/api/push.html#createpushmessage)) 手动创建通知栏消息。
+2. 服务端执行推送时,传递参数`force_notification:true`,客户端就会自动创建“通知栏消息”(此时你监听不到消息内容),当用户点击通知栏消息后,APP才能监听到消息内容。
+
+以上两种方案各有优劣:
+- 方案一更加灵活;比如:客服功能,客户端接收到聊天消息时,应用如果已经打开聊天对话页面,就直接将监听到的推送内容,渲染到页面。如果应用未打开聊天页,则调用api创建“通知栏消息”提醒用户;此时你还可以执行一些其他逻辑,比如将tabBar的消息中心加红点等。
+
+- 方案二比较简便,客户端无需额外编写代码,自动创建通知栏消息;但仅适用于不关心客户端行为就创建“通知栏消息”的场景,如广告营销内容的推送等。
+
+### 安卓在线收不到通知
+- 检查推送的 cid,是否是当前这个测试设备的。如果卸载重装,cid会变,需要用最新的 cid推。
+- 检查手机上该 app的通知栏权限是否正常开启了,部分手机可能默认是关闭的。
+- 当应用在线时,不会创建“通知栏消息”,此时客户端会立即监听到消息内容。
+    - 监听到消息内容后,根据业务需要自己判断是否要创建“通知栏消息”,需要就调用创建本地消息API [uni.createPushMessage](https://uniapp.dcloud.net.cn/api/plugins/push.html#createpushmessage)手动创建通知栏消息。
+    - 服务端执行推送时,传递参数`force_notification:true`,客户端就会自动创建“通知栏消息”(此时你的APP监听不到消息内容),当用户点击通知栏消息后,APP才能监听到消息内容。
+
+### 服务端推送消息
+https://uniapp.dcloud.net.cn/unipush-v2.html#%E7%AC%AC### 安卓在线收不到通知
+- 检查推送的 cid,是否是当前这个测试设备的。如果卸载重装,cid会变,需要用最新的 cid推。
+- 检查手机上该 app的通知栏权限是否正常开启了,部分手机可能默认是关闭的。
+- 当应用在线时,不会创建“通知栏消息”,此时客户端会立即监听到消息内容。
+    - 监听到消息内容后,根据业务需要自己判断是否要创建“通知栏消息”,需要就调用创建本地消息API [uni.createPushMessage](https://uniapp.dcloud.net.cn/api/plugins/push.html#createpushmessage)手动创建通知栏消息。
+    - 服务端执行推送时,传递参数`force_notification:true`,客户端就会自动创建“通知栏消息”(此时你的APP监听不到消息内容),当用户点击通知栏消息后,APP才能监听到消息内容。E5%9B%9B%E6%AD%A5-%E6%9C%8D%E5%8A%A1%E7%AB%AF%E6%8E%A8%E9%80%81%E6%B6%88%E6%81%AF
+
+### uni-push2.0 常见问题
+https://ask.dcloud.net.cn/article/40291
+
+
+### 安卓厂商离线推送是否要求上架应用商店?
+- 目前华为、荣耀、魅族、[oppo(测试环境)](https://open.oppomobile.com/new/developmentDoc/info?id=11257)不要求上架应用商店;vivo 、小米、[oppo(正式环境)](https://open.oppomobile.com/new/developmentDoc/info?id=11257)必须上架应用商店后才可使用离线厂商推送。
+
+### 消息分类
+
+1. 荣耀 -- 消息分类标准 https://developer.honor.com/cn/docs/11002/guides/notification-class
+2. 华为 -- 消息类别   https://developer.huawei.com/consumer/cn/doc/HMSCore-Guides/message-classification-0000001149358835#section3410731125514
+
+
+### 手机设备id
+1
+---
+华为: 9a5f7a63e290bf28f35d0691484e0721
+透传内容:{"order": 453225}
+title:  新订单
+content:  有客户下单,订单号: 453230
+扩展字段: options ---- 现部分厂商特定功能,包括仅部分厂商支持、不常用或厂商临时新增的功能(不依赖 uni-push,厂商文档支持的参数可直接使用)。
+
+Options参数说明:
+- 参数示例
+```
+{
+  "android": {
+    "ups": {
+      "notification": {
+        // ...其他push_channel参数略
+      },
+      "options": {
+        "HW": {
+            "/message/android/category": "填写华为侧的category取值" // EXPRESS
+        }
+      }
+    }
+  }
+}
+```
+
+2
+---
+OPPO:   2539a06dde18170d61f235dd40253d36
+录入到测试设备 --- https://open.oppomobile.com/documentation/page/info?id=11251
+
+3
+---
+荣耀:6012fd931b5aa8cc028bec036bca9bc2
+
+4
+---
+VIVO:  线下:
+线上:
+
+
+
+### 多厂商参数
+https://doc.dcloud.net.cn/uniCloud/uni-cloud-push/options.html
+
+### 安卓厂商离线推送是否要求上架应用商店?
+- 目前华为、荣耀、魅族、[oppo(测试环境)](https://open.oppomobile.com/new/developmentDoc/info?id=11257)不要求上架应用商店;vivo 、小米、[oppo(正式环境)](https://open.oppomobile.com/new/developmentDoc/info?id=11257)必须上架应用商店后才可使用离线厂商推送。
+
+### 如何给华为、荣耀、vivo、oppo厂商发送测试消息
+
+Android 厂商有离线推送的额度限制,基本都限制单设备单应用每天只能收到 2 条普通消息;如果要提升额度,可以自己向厂商申请消息分类。详见:[厂商通道限额&QPS说明](https://docs.getui.com/getui/mobile/vendor/qps/)
+
+**开发测试阶段额度不足时,可以发送测试消息,目前仅华为、荣耀、vivo、oppo 支持下发测试消息。发送测试消息方式如下:**
+
+1. 若调用服务端 api 推送,增加options参数:
+```
+"options": {  
+  "HW": {    
+      // 值为int 类型。1 表示华为测试消息,华为每个应用每日可发送该测试消息500条,此target_user_type 参数请勿发布至线上。    
+      "/message/android/target_user_type":1    
+    } ,  
+  "HO": {  
+      //值为int 类型。1 表示测试推送,不填默认为0。荣耀每个应用每日可发送该测试消息1000条。此测试参数请勿发布至线上。  
+      "/android/targetUserType": 1  
+    },  
+  "VV": {    
+      //值为int 类型。0 表示正式推送;1 表示测试推送,不填默认为0。线上请勿使用测试推送  
+      "/pushMode":1    
+    }    
+}
+```
+- vivo、oppo 发送测试消息,额外需要分别在 [vivo 开放平台](https://dev.vivo.com.cn/promote/pushNews) 、 [oppo开放平台](https://open.oppomobile.com/new/developmentDoc/info?id=11251) 录入测试用户(regid 对应个推cid 绑定的 device token,可以从个推后台的“故障排查”中查询 cid 信息获取)。
+- 华为、荣耀不需要录入测试用户。
+- 华为、荣耀、vivo 需要在options内添加测试参数。
+- oppo 只需要添加测试设备,不需要options内加参数。
+
+
+### 数据表
+```
+CREATE TABLE `xhHdDevice` (
+	`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+	`clientId` varchar(120) NOT NULL DEFAULT '' COMMENT '个推客户端id',
+	`adminId` int(11) unsigned NOT NULL COMMENT '登录用户Id',
+	`mainId` int(11) NOT NULL DEFAULT '0' COMMENT '中央id',
+	`shopId` int(11) NOT NULL DEFAULT '0' COMMENT '零售店门店id',
+	`autoLoginTime` timestamp NOT NULL DEFAULT '1970-01-02 00:00:00' COMMENT '自动登录时间',
+	`pwdLoginTime` timestamp NOT NULL DEFAULT '1970-01-02 00:00:00' COMMENT '密码登录时间',
+	`status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '状态: 0未登录 1登录',
+	`addTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+	`updateTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+	PRIMARY KEY (`id`),
+	KEY `cid` (`clientId`),
+	KEY `mid` (`mainId`),
+	KEY `sid` (`shopId`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='零售设备表';
+
+
+CREATE TABLE `xhGhsDevice` (
+	`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+	`clientId` varchar(120) NOT NULL DEFAULT '' COMMENT '个推客户端id',
+	`adminId` int(11) unsigned NOT NULL COMMENT '登录用户Id',
+	`mainId` int(11) NOT NULL DEFAULT '0' COMMENT '中央id',
+	`shopId` int(11) NOT NULL DEFAULT '0' COMMENT '批发门店id',
+	`autoLoginTime` timestamp NOT NULL DEFAULT '1970-01-02 00:00:00' COMMENT '自动登录时间',
+	`pwdLoginTime` timestamp NOT NULL DEFAULT '1970-01-02 00:00:00' COMMENT '密码登录时间',
+	`status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '状态:0未登录 1登录',
+	`addTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+	`updateTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+	PRIMARY KEY (`id`),
+	KEY `cid` (`clientId`),
+	KEY `mid` (`mainId`),
+	KEY `sid` (`shopId`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='批发设备表';
+```
+查询 clientId ,如果不存在,则新建数据 --  mainId 、 shopId  哪个更合适? 
+1. shopId 能区分是零售还是批发 , 但表本身就具备
+2. mainId 能一下就知道它是哪个商户的,但没有区分出在哪个门店下
+3. 初步得出结论是: mainId  +  shopId 
+
+### 功能梳理
+1. 针对每个厂商的 option 设置
+2. 前端对消息类型与消息内容的处理实现细节
+3. 后端针对消息类型的封装处理细节,如何是更合理的封装(问AI,把需要封装的参数与不同条件处理告知AI,请其使用合理的方式组织起来)
+
+处理事项:
+1. 角标处理, 按消息阅读处理--减掉
+
+
+### 有需要的功能
+1. 创建一个查询 clientId 是否在线的 API --- 类似在云端发送 push 通知的云函数
+
+## 资料
+1. [uni-push2.0 常见问题](https://ask.dcloud.net.cn/article/40291)
+2. [推送后效分析说明](https://docs.getui.com/pusheffect)
+3. [RestAPI V2 (推荐使用) > 多厂商参数](https://docs.getui.com/getui/server/rest_v2/third_party)

+ 52 - 0
任务小笔记/25-0925:App 通知/上线.md

@@ -0,0 +1,52 @@
+### SQL
+```
+CREATE TABLE `xhGhsDevice` (
+  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+  `clientId` varchar(120) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '个推客户端id',
+  `adminId` int(11) unsigned NOT NULL COMMENT '登录用户Id',
+  `mainId` int(11) NOT NULL DEFAULT '0' COMMENT '中央id',
+  `shopId` int(11) NOT NULL DEFAULT '0' COMMENT '批发门店id',
+  `autoLoginTime` timestamp NOT NULL DEFAULT '1970-01-02 00:00:00' COMMENT '自动登录时间',
+  `pwdLoginTime` timestamp NOT NULL DEFAULT '1970-01-02 00:00:00' COMMENT '密码登录时间',
+  `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '状态:0未登录 1登录',
+  `addTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+  `updateTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+  PRIMARY KEY (`id`),
+  KEY `cid` (`clientId`),
+  KEY `mid` (`mainId`),
+  KEY `sid` (`shopId`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='批发设备表';
+
+
+CREATE TABLE `xhHdDevice` (
+  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+  `clientId` varchar(120) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '个推客户端id',
+  `adminId` int(11) unsigned NOT NULL COMMENT '登录用户Id',
+  `mainId` int(11) NOT NULL DEFAULT '0' COMMENT '中央id',
+  `shopId` int(11) NOT NULL DEFAULT '0' COMMENT '零售店门店id',
+  `autoLoginTime` timestamp NOT NULL DEFAULT '1970-01-02 00:00:00' COMMENT '自动登录时间',
+  `pwdLoginTime` timestamp NOT NULL DEFAULT '1970-01-02 00:00:00' COMMENT '密码登录时间',
+  `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '状态: 0未登录 1登录',
+  `addTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+  `updateTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+  PRIMARY KEY (`id`),
+  KEY `cid` (`clientId`),
+  KEY `mid` (`mainId`),
+  KEY `sid` (`shopId`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='零售设备表';
+```
+
+### uni-admin 框架(原名 uniCloud admin)
+使用 uni-admin 分别创建两个云服务空间,请前往 https://unicloud.dcloud.net.cn/  查看
+- ghs-uni-admin
+- hd-uni-admin
+
+什么是 uni-admin 请查看 https://doc.dcloud.net.cn/uniCloud/admin.html
+
+uni-admin 中包含有以下主要功能:
+- Uni 统计
+App 开放的 uni 统计在此查看
+
+- 推送管理
+1.可以做为 push 消息测试
+2.可以查看push发送统计

+ 94 - 0
任务小笔记/25-0925:App 通知/如何创建签名文件(.keystore).md

@@ -0,0 +1,94 @@
+对于 UniApp 开发者来说,**签名文件(`.keystore` 或 `.jks`)并不是自动生成的**,需要你**手动创建并配置**。以下是你创建签名文件的具体路径和方法:
+
+---
+
+### ✅ 一、签名文件不会自动存在,需要你创建
+
+UniApp 项目本身**不会自带签名文件**,尤其是用于**正式发布**的签名证书,必须你自己生成。
+
+---
+
+### ✅ 二、如何创建签名文件(.keystore)
+
+#### 方法一:使用 JDK 自带的 `keytool` 命令(推荐)
+
+1. 打开终端或命令提示符
+2. 执行以下命令:
+
+```bash
+keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000
+```
+
+3. 按提示填写:
+   - 密钥库密码(store password)
+   - 密钥别名密码(key password)
+   - 姓名、组织等信息
+
+4. 生成的 `my-release-key.keystore` 文件即为你的签名文件,**请妥善保存**
+
+---
+
+### ✅ 三、在 UniApp 中配置签名文件路径
+
+#### 云打包方式(HBuilderX):
+
+1. 打开 HBuilderX
+2. 点击顶部菜单:`发行` → `原生App-云打包`
+3. 在弹出的窗口中:
+   - 选择 `使用自有证书`
+   - 填写:
+     - 签名文件路径(你刚创建的 `.keystore` 文件)
+     - 签名文件密码
+     - 别名(alias)
+     - 别名密码
+4. 点击打包即可
+
+> ⚠️ 注意:云打包时,签名文件**必须上传**或**本地路径正确**,否则打包失败。
+
+---
+
+### ✅ 四、签名文件存放位置建议
+
+你可以将签名文件放在:
+- 项目根目录下的 `key/` 文件夹(便于管理)
+- 或其他你记得住的安全路径
+
+例如:
+```
+your-project/
+├── key/
+│   └── my-release-key.keystore
+```
+
+---
+
+### ✅ 五、如果你用的是离线打包(Android Studio)
+
+你需要手动将签名文件路径配置到 `build.gradle` 文件中:
+
+```groovy
+signingConfigs {
+    release {
+        storeFile file("../key/my-release-key.keystore")
+        storePassword "你的密钥库密码"
+        keyAlias "my-key-alias"
+        keyPassword "你的别名密码"
+    }
+}
+```
+
+---
+
+### ✅ 总结
+
+| 问题 | 答案 |
+|------|------|
+| UniApp 项目自带签名文件吗? | ❌ 不带,必须自己生成 |
+| 如何创建签名文件? | 使用 `keytool` 命令生成 `.keystore` 文件 |
+| 签名文件放哪里? | 建议放在项目根目录的 `key/` 文件夹中 |
+| 云打包时如何配置? | 在 HBuilderX 的打包界面填写签名信息 |
+| 离线打包如何配置? | 在 `build.gradle` 中配置 `signingConfigs` |
+
+---
+
+如你还没创建签名文件,**现在就可用上面命令生成一个**,然后在打包时配置使用即可。如果你需要我帮你检查签名文件是否有效,或如何获取 SHA1,也可以继续问我。

+ 2 - 0
任务小笔记/线上注册新号/注册信息.md

@@ -0,0 +1,2 @@
+
+mainId  ----   73640