Compare commits

32 Commits

Author SHA1 Message Date
hackrobot
eca22d3d01 'ss' 2025-01-07 20:14:17 +08:00
hackrobot
2acaff3426 'ss' 2025-01-07 13:21:42 +08:00
hackrobot
a7a97815cf 'ss' 2025-01-07 13:10:25 +08:00
hackrobot
681add24a7 'ss' 2025-01-07 13:03:03 +08:00
hackrobot
0d7e2ee59c 'ss' 2025-01-06 13:28:40 +08:00
hackrobot
a29f316c2d 'ss' 2025-01-06 13:27:23 +08:00
hackrobot
d245229188 '' 2025-01-06 11:16:23 +08:00
hackrobot
4ae990749a '' 2025-01-06 11:12:28 +08:00
hackrobot
f922c35d72 'update' 2025-01-06 10:55:14 +08:00
hackrobot
ef87e2fdb3 update 2024-10-27 09:58:06 +08:00
hackrobot
bf571acf59 'sss' 2024-10-20 16:11:43 +08:00
hackrobot
985efbe87e 'hell' 2024-10-20 15:28:44 +08:00
hackrobot
5a16a962d1 'hello' 2024-10-20 15:12:01 +08:00
hackrobot
7b8cd49656 'hello' 2024-10-20 14:48:49 +08:00
hackrobot
030ba5a88e 'bug' 2024-10-06 08:04:58 +08:00
hackrobot
fe40e5606f 'ss' 2024-10-04 22:43:52 +08:00
hackrobot
8107564d64 'ss' 2024-10-04 22:34:27 +08:00
hackrobot
0b645c5f5f 'dd' 2024-10-04 19:38:35 +08:00
hackrobot
b1b0c4eda9 'ss' 2024-10-04 19:23:07 +08:00
hackrobot
9d43610fe1 'ss' 2024-10-04 19:07:18 +08:00
hackrobot
e6eae7bedc 'ss' 2024-10-04 19:00:51 +08:00
hackrobot
af1a72d359 'ss' 2024-10-04 18:59:37 +08:00
hackrobot
255b722242 'ss' 2024-10-04 16:48:56 +08:00
hackrobot
720a58e0d2 'dd' 2024-10-04 16:38:59 +08:00
hackrobot
223a88ab0c 'dd' 2024-10-04 16:27:48 +08:00
hackrobot
93f20d8c3a 'hello' 2024-10-02 21:51:39 +08:00
hackrobot
037bb71a9b update 2024-09-14 12:49:49 +08:00
hackrobot
c4b1552228 update 2024-09-14 12:46:33 +08:00
hackrobot
3f46534db9 update 2024-09-14 12:45:39 +08:00
hackrobot
00a0e1eb48 'ss' 2024-09-14 12:44:18 +08:00
hackrobot
cb31deccbd update 2024-09-14 12:42:55 +08:00
hackrobot
7c4d9da605 'ss' 2024-09-14 12:30:05 +08:00
30 changed files with 920 additions and 138 deletions

1
.env.development Normal file
View File

@@ -0,0 +1 @@
process.env.TARO_API_API="/api"

1
.env.production Normal file
View File

@@ -0,0 +1 @@
process.env.TARO_API_API="https://web.hackrobot.cn"

2
.gitignore vendored
View File

@@ -1,4 +1,4 @@
dist/
# dist/
deploy_versions/
.temp/
.rn_temp/

View File

@@ -3,6 +3,7 @@ module.exports = {
NODE_ENV: '"development"'
},
defineConstants: {
'process.env.TARO_API_API': JSON.stringify("/api")
},
mini: {},
h5: {}

View File

@@ -1,5 +1,6 @@
const config = {
projectName: "cityh5",
date: "2023-12-2",
designWidth: 750,
deviceRatio: {
@@ -83,7 +84,7 @@ const config = {
// },
devServer: {
// host: 'nomad.hackrobot.cn', // 替换为您的域名
// port: 10086, // 选择一个适当的端口号
// port: 10087, // 选择一个适当的端口号
proxy: {
'/api/': {
target: JSON.parse('"http://localhost:8700"'), //本地调试端口
@@ -95,7 +96,7 @@ const config = {
},
// 允许特定域名访问
allowedHosts: [
'nomad.hackrobot.cn'
'bot.hackrobot.cn'
],
}
},

View File

@@ -3,6 +3,7 @@ module.exports = {
NODE_ENV: '"production"'
},
defineConstants: {
'process.env.TARO_API_API': JSON.stringify("https://web.hackrobot.cn")
},
mini: {},
h5: {

View File

View File

@@ -7,8 +7,7 @@ export default {
'pages/group/index',
'pages/book/index',
'pages/salon/index',
'pages/sphone/index'
],
window: {
backgroundTextStyle: 'light',

BIN
src/images/joinGroup.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

BIN
src/images/robot192.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

View File

@@ -8,8 +8,21 @@
<meta name="format-detection" content="telephone=no,address=no">
<meta name="apple-mobile-web-app-status-bar-style" content="white">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" >
<link rel="apple-touch-icon" href="/static/images/images/touxiang.png" />
<link
rel="icon"
sizes="192x192"
href="/static/images/images/touxiang.png"
/>
<title>异度星球</title>
<meta name="description" content="折腾技术,数字游民社区">
<meta property="og:description" content="折腾技术,数字游民社区">
<meta name="twitter:description" content="折腾技术,数字游民社区">
<script><%= htmlWebpackPlugin.options.script %></script>
<!-- 禁止缓存 -->
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
</head>
<body>
<div id="app"></div>

View File

@@ -41,9 +41,3 @@
以youtube频道作为副资产获利
最近在策划`coffeechat以及小型沙龙`
---
## 持续更新中
> 有建议请私聊

View File

@@ -23,4 +23,15 @@
// color: red;
}
}
.joinSalon {
// position: relative;
// bottom: 20px;
// position: fixed;
width: 700px;
font-weight: 600;
background-color:#72D572 ;
border-color: #72D572 ;;
}
}

View File

@@ -14,7 +14,8 @@ import { AtTag } from "taro-ui";
import { AtList, AtListItem } from "taro-ui";
import { AtForm, AtMessage } from "taro-ui";
import { marked } from "marked";
import markdownText from "./text.md";
import infoText from "./info.md";
import bookText from "./book.md";
marked.setOptions({
breaks: true, // 是否回车换行
@@ -39,22 +40,110 @@ marked.setOptions({
// export default class Index extends Component {
const Book = () => {
const [markText, setmarkText] = useState();
const [isWeChat, setisWeChat] = useState(false);
useEffect(() => {}, []);
const [book, setbook] = useState(window.localStorage.getItem("book"));
const handleClick = (value) => {
// 跳转到目的页面,在当前页面打开
Taro.navigateTo({
url: "/pages/index/index",
useEffect(() => {
isWeChatFun();
}, []);
// const handleClick = (value) => {
// // 跳转到目的页面,在当前页面打开
// Taro.navigateTo({
// url: "/pages/index/index",
// });
// };
// 是否在微信客户端
const isWeChatFun = () => {
var ua = navigator.userAgent.toLowerCase();
if (ua.indexOf("micromessenger") != -1) {
setisWeChat(true);
return true;
} else {
setisWeChat(false);
return false;
}
};
const payh5 = (type, total_fee = 1000) => {
// console.log("111");
Taro.request({
method: "POST",
url: `${process.env.TARO_API_API}/payh5`, //仅为示例,并非真实的接口地址
// url: "https://pay.hackrobot.cn${process.env.TARO_API_API}/payh5", //仅为示例,并非真实的接口地址
data: {
callback_url: window.location.href,
openid: window.localStorage.getItem("openid"),
total_fee: total_fee, // 金额,单位:分
type: type, //订单类型 book/meetup/video/vip
},
header: {
"content-type": "application/json", // 默认值
},
success: function (res) {
console.log(res.data);
// window.alert(res.data.jsapi);
WeixinJSBridge.invoke(
"getBrandWCPayRequest",
{
// 以下6个支付参数通过payjs的jsapi接口获取
// appId: "wxc5205a653b0259bf",
// timeStamp: "1701401644",
// nonceStr: "KhOYB0wFV6j9qyQK",
// package: "prepay_id=wx01113404850024729b35f4d69b73500000",
// signType: "MD5",
// paySign: "2A823C8D47CCF871C6C65A56DC228CF8",
...(res?.data?.jsapi ?? {}),
},
function (res) {
// 支付成功
if (res.err_msg == "get_brand_wcpay_request:ok") {
window.localStorage.setItem(type, 1); //订单类型 book/meetup/video/vip
WeixinJSBridge.call("closeWindow");
}
}
);
},
});
};
return (
<View className="Book">
<View
className="markdown-body" // 添加 GitHub Markdown 主题类
dangerouslySetInnerHTML={{ __html: marked(markdownText) }}
dangerouslySetInnerHTML={{
__html: marked(book == 1 ? bookText : infoText),
}}
></View>
<View className="bottomDiv"></View>
{/* 判断有没有wxid,是否女性 */}
{book != 1 ? (
<AtButton
type="primary"
size="normal"
className="joinSalon"
onClick={() => {
if (book == 1) {
return false;
} else {
if (!!isWeChat) {
// 19.8元
payh5("book", 1980);
} else {
// setmeetupQR(true);
}
}
}}
>
{/* {meetup == 1 ? "已加入" : `立即加入`} */}
{`阅读更多`}
</AtButton>
) : null}
</View>
);
};

43
src/pages/book/info.md Normal file
View File

@@ -0,0 +1,43 @@
## 一人公司方法论
> 公司化运营业务,但并不是注册企业主体
<img src="https://hackrobot-1258475618.cos.ap-shenzhen-fsi.myqcloud.com/book.png?imageSlim" title="" alt="book.png" width="248">
这本书是基于H5页面的`单页书籍`,会不定时更新
本主要基于个人的学习,实践,总结一套方法论,包含了`道``术`
读者可以参考借鉴
主题包含并不限于以下:
- 云手机+微信机器人+AIGC+边缘计算
- youtube频道获利
- 独立开发者
- 跨境电商
- 旅行+远程办公
---
## 简介
> 数字游民实践者
<img src="https://hackrobot-1258475618.cos.ap-shenzhen-fsi.myqcloud.com/avatar.jpg?imageSlim" title="" alt="avatar.jpg" width="254">
曾经是程序员,业余开发软件工具
有公司主体,运营跨境电商亚马逊
平时爱折腾技术,以`树莓派`为主
目前方向是偏户外/旅行
以youtube频道作为副资产获利
最近在策划`coffeechat以及小型沙龙`

View File

@@ -1,3 +1,3 @@
export default {
navigationBarTitleText: '数字游民工具箱'
navigationBarTitleText: '异度星球'
}

View File

@@ -39,7 +39,7 @@ import meetup from "../../images/meetup.jpg";
import bookqr from "../../images/bookqr.jpg";
import loft from "../../images/loft.png";
import AIGC from "../../images/AIGC.png";
import robot192 from "../../images/robot192.png";
// export default class Index extends Component {
const Index = () => {
@@ -105,8 +105,8 @@ const Index = () => {
// 查询数据库是否存在openid
Taro.request({
method: "GET",
url: `/api/user/${hashopenid}`, //仅为示例,并非真实的接口地址
// url: `/api/user/${window.localStorage.getItem("openid")}`, //仅为示例,并非真实的接口地址
url: `${process.env.TARO_API_API}/user/${hashopenid}`, //仅为示例,并非真实的接口地址
// url: `${process.env.TARO_API_API}/user/${window.localStorage.getItem("openid")}`, //仅为示例,并非真实的接口地址
success: function (res) {
if (res?.data?.userInfo) {
// 有完整的用户信息userInfo
@@ -131,8 +131,8 @@ const Index = () => {
const getUserinfo = (wxid) => {
Taro.request({
method: "GET",
url: `/api/user/${wxid}`, //仅为示例,并非真实的接口地址
// url: `/api/user/${window.localStorage.getItem("openid")}`, //仅为示例,并非真实的接口地址
url: `${process.env.TARO_API_API}/user/${wxid}`, //仅为示例,并非真实的接口地址
// url: `${process.env.TARO_API_API}/user/${window.localStorage.getItem("openid")}`, //仅为示例,并非真实的接口地址
success: function (res) {
if (res?.data?.userInfo) {
//判断wxid是否存在
@@ -157,8 +157,8 @@ const Index = () => {
// 优先查询openid是否存在数据库
Taro.request({
method: "GET",
url: `/api/user/${urlwxid}`, //仅为示例,并非真实的接口地址
// url: `/api/user/${window.localStorage.getItem("openid")}`, //仅为示例,并非真实的接口地址
url: `${process.env.TARO_API_API}/user/${urlwxid}`, //仅为示例,并非真实的接口地址
// url: `${process.env.TARO_API_API}/user/${window.localStorage.getItem("openid")}`, //仅为示例,并非真实的接口地址
success: function (res) {
if (res?.data?.userInfo) {
//判断wxid是否存在
@@ -207,8 +207,8 @@ const Index = () => {
};
Taro.request({
method: "PUT",
// url: `/api/user/${urlwxid}`, //仅为示例,并非真实的接口地址
url: `/api/user/${newWxid}`, //仅为示例,并非真实的接口地址
// url: `${process.env.TARO_API_API}/user/${urlwxid}`, //仅为示例,并非真实的接口地址
url: `${process.env.TARO_API_API}/user/${newWxid}`, //仅为示例,并非真实的接口地址
data: userUpdateData,
header: {
"Content-Type": "application/json",
@@ -226,8 +226,10 @@ const Index = () => {
};
Taro.request({
method: "GET",
// url: `/api/user/${urlwxid}`, //仅为示例,并非真实的接口地址
url: `/api/user/${window.localStorage.getItem("openid")}`, //仅为示例,并非真实的接口地址
// url: `${process.env.TARO_API_API}/user/${urlwxid}`, //仅为示例,并非真实的接口地址
url: `${process.env.TARO_API_API}/user/${window.localStorage.getItem(
"openid"
)}`, //仅为示例,并非真实的接口地址
data: userUpdateData,
header: {
"Content-Type": "application/json",
@@ -242,8 +244,10 @@ const Index = () => {
const tgMessage = () => {
Taro.request({
method: "GET",
url: `/api/tgMessage?openid=${window.localStorage.getItem("openid")}`, //仅为示例,并非真实的接口地址
// url: "https://pay.hackrobot.cn/api/payh5", //仅为示例,并非真实的接口地址
url: `${
process.env.TARO_API_API
}/tgMessage?openid=${window.localStorage.getItem("openid")}`, //仅为示例,并非真实的接口地址
// url: "https://pay.hackrobot.cn${process.env.TARO_API_API}/payh5", //仅为示例,并非真实的接口地址
success: function (res) {
console.log("访问提醒发送成功");
},
@@ -280,8 +284,10 @@ const Index = () => {
// console.log("111");
Taro.request({
method: "POST",
url: "/api/payh5", //仅为示例,并非真实的接口地址
// url: "https://pay.hackrobot.cn/api/payh5", //仅为示例,并非真实的接口地址
url: `${process.env.TARO_API_API}/payh5`,
// url: "${process.env.TARO_API_API}/payh5",
// url: "https://pay.hackrobot.cn${process.env.TARO_API_API}/payh5", //仅为示例,并非真实的接口地址
data: {
callback_url: window.location.href,
@@ -368,7 +374,7 @@ const Index = () => {
<br />
副业是做跨境电商
<br />
做一个<span className="spanText">数字游民</span>ing😎
做一个<span className="spanText">数字游民</span>ing
</View>
</View>
@@ -376,14 +382,16 @@ const Index = () => {
<View className="index-list">
<AtList>
<AtListItem
title="云手机"
title="云手机 🔥"
arrow="right"
// hasBorder={false}
thumb={phone}
onClick={() => {
window.location.href =
// "https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzU4NTgyNDUxNw==&action=getalbum&album_id=3403853254399082501#wechat_redirect";
"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzU4NTgyNDUxNw==&action=getalbum&album_id=3555705062712901639#wechat_redirect";
Taro.navigateTo({
url: "/pages/sphone/index",
});
// window.location.href =
// "https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzU4NTgyNDUxNw==&action=getalbum&album_id=3555705062712901639#wechat_redirect";
}}
/>
<AtListItem
@@ -397,7 +405,7 @@ const Index = () => {
"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzU4NTgyNDUxNw==&action=getalbum&album_id=3629790245010128902#wechat_redirect";
}}
/>
<AtListItem
<AtListItem
title="AIGC"
arrow="right"
// hasBorder={false}
@@ -426,8 +434,8 @@ const Index = () => {
<AtCard
// note="提示文字"
// extra="2024/09/18"
extra="已报名:3人"
title="线下沙龙"
// extra="已加入:200+"
title="加群"
thumb="http://img12.360buyimg.com/jdphoto/s72x72_jfs/t10660/330/203667368/1672/801735d7/59c85643N31e68303.png"
>
<View className="meetup-card">
@@ -442,10 +450,10 @@ const Index = () => {
{/* 右边 */}
<View className="meetup-right">
<View className="title"> 自由交流&副业 | 沙龙(6) </View>
<View className="title"> 技术交流:云手机/机器人/AI </View>
<View className="address">
<AtIcon value="map-pin" size="30" color="#F00"></AtIcon>
<span>深圳市龙华区</span>
<span>异度世界</span>
</View>
<View className="meetBtn">
{/* <View>
@@ -498,8 +506,8 @@ const Index = () => {
};
Taro.request({
method: "PUT",
// url: `/api/user/${urlwxid}`, //仅为示例,并非真实的接口地址
url: `/api/user/${wxid}`, //仅为示例,并非真实的接口地址
// url: `${process.env.TARO_API_API}/user/${urlwxid}`, //仅为示例,并非真实的接口地址
url: `${process.env.TARO_API_API}/user/${wxid}`, //仅为示例,并非真实的接口地址
data: userUpdateData,
header: {
"Content-Type": "application/json",
@@ -531,7 +539,7 @@ const Index = () => {
? "已报名"
: // : "立即报名"}
"已满"} */}
{`查看`}
{`加入`}
</View>
</View>
</View>
@@ -594,8 +602,8 @@ const Index = () => {
};
Taro.request({
method: "PUT",
// url: `/api/user/${urlwxid}`, //仅为示例,并非真实的接口地址
url: `/api/user/${wxid}`, //仅为示例,并非真实的接口地址
// url: `${process.env.TARO_API_API}/user/${urlwxid}`, //仅为示例,并非真实的接口地址
url: `${process.env.TARO_API_API}/user/${wxid}`, //仅为示例,并非真实的接口地址
data: userUpdateData,
header: {
"Content-Type": "application/json",
@@ -648,7 +656,22 @@ const Index = () => {
<View className="emojitext">
<View>
<AtIcon value="file-generic" size="30" color="#F00"></AtIcon>{" "}
markdown转emoji编辑器
数字游民cna (ios app)
</View>
{/* <AtIcon
value="download-cloud"
size="30"
color="#F00"
onClick={() => {
// setisOpened(true);
}}
></AtIcon> */}
<span>待上架</span>
</View>
<View className="emojitext">
<View>
<AtIcon value="file-generic" size="30" color="#F00"></AtIcon>{" "}
emoji图文编辑器 (pc客户端)
</View>
<AtIcon
value="download-cloud"

View File

@@ -72,8 +72,8 @@ const Detail = () => {
// console.log("111");
Taro.request({
method:'POST',
url: "/api/payh5", //仅为示例,并非真实的接口地址
// url: "https://pay.hackrobot.cn/api/payh5", //仅为示例,并非真实的接口地址
url: `${process.env.TARO_API_API}/payh5`, //仅为示例,并非真实的接口地址
// url: "https://pay.hackrobot.cn${process.env.TARO_API_API}/payh5", //仅为示例,并非真实的接口地址
data: {
callback_url:window.location.href,

View File

@@ -0,0 +1,3 @@
export default {
navigationBarTitleText: '副业沙龙'
}

View File

@@ -0,0 +1,23 @@
.Model {
padding: 20px;
.bottomDiv {
width: 100%;
height: 100px;
// background-color: yellow;
}
.joinSalon {
// position: relative;
bottom: 20px;
position: fixed;
width: 700px;
}
.model-emoji {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
}

217
src/pages/planet/index.tsx Normal file
View File

@@ -0,0 +1,217 @@
// @ts-nocheck
import { Component } from "react";
import { View, Text, Image, Button } from "@tarojs/components";
import "./index.scss";
import { AtButton, AtInput, AtTabBar } from "taro-ui";
import React, { useCallback, useEffect, useState } from "react";
import { AtGrid } from "taro-ui";
import { Swiper, SwiperItem } from "@tarojs/components";
import { AtCard } from "taro-ui";
import { AtImagePicker } from "taro-ui";
import Taro from "@tarojs/taro";
import { AtTag } from "taro-ui";
import { AtList, AtListItem } from "taro-ui";
import { AtForm, AtMessage } from "taro-ui";
import loft from "../../images/loft.png";
import nomadvloglife from "../../images/nomadvloglife.png";
import {
AtModal,
AtModalHeader,
AtModalContent,
AtModalAction,
AtAvatar,
AtAccordion,
} from "taro-ui";
import qrcode from "../../images/qrcode.png";
import joinGroup from "../../images/joinGroup.png";
// export default class Index extends Component {
const Salon = () => {
const [meetupQR, setmeetupQR] = useState(false);
const [isWeChat, setisWeChat] = useState(false);
const [meetup, setmeetup] = useState(window.localStorage.getItem("meetup"));
useEffect(() => {
isWeChatFun();
}, []);
// const handleClick = (value) => {
// // 跳转到目的页面,在当前页面打开
// Taro.navigateTo({
// url: "/pages/index/index",
// });
// };
// 是否在微信客户端
const isWeChatFun = () => {
var ua = navigator.userAgent.toLowerCase();
if (ua.indexOf("micromessenger") != -1) {
setisWeChat(true);
return true;
} else {
setisWeChat(false);
return false;
}
};
const payh5 = (type, total_fee = 1000) => {
// console.log("111");
Taro.request({
method: "POST",
url: `${process.env.TARO_API_API}/payh5`, //仅为示例,并非真实的接口地址
// url: "https://pay.hackrobot.cn${process.env.TARO_API_API}/payh5", //仅为示例,并非真实的接口地址
data: {
callback_url: window.location.href,
openid: window.localStorage.getItem("openid"),
total_fee: total_fee, // 金额,单位:分
type: type, //订单类型 book/meetup/video/vip
},
header: {
"content-type": "application/json", // 默认值
},
success: function (res) {
console.log(res.data);
// window.alert(res.data.jsapi);
WeixinJSBridge.invoke(
"getBrandWCPayRequest",
{
// 以下6个支付参数通过payjs的jsapi接口获取
// appId: "wxc5205a653b0259bf",
// timeStamp: "1701401644",
// nonceStr: "KhOYB0wFV6j9qyQK",
// package: "prepay_id=wx01113404850024729b35f4d69b73500000",
// signType: "MD5",
// paySign: "2A823C8D47CCF871C6C65A56DC228CF8",
...(res?.data?.jsapi ?? {}),
},
function (res) {
// 支付成功
if (res.err_msg == "get_brand_wcpay_request:ok") {
window.localStorage.setItem(type, 1); //订单类型 book/meetup/video/vip
WeixinJSBridge.call("closeWindow");
}
}
);
},
});
};
return (
<View className="Model">
<View className="meetup-left">
<Image style="width: 100%;height: 100px;background: #fff;" src={loft} />
</View>
<View className="at-article">
<View className="at-article__h1"></View>
<View className="at-article__info">
{/* 2017-05-07&nbsp;&nbsp;&nbsp; */}
</View>
<View className="at-article__content">
<View className="at-article__section">
<View className="at-article__h2"></View>
<View className="at-article__h3">| 📣</View>
<View className="at-article__p">
,/
</View>
<br />
<View className="at-article__h3">| 📋</View>
<View className="at-article__p">
,
<br />
:
<br />
1
<br />
2
<br />
3AIGC /
</View>
<br />
<View className="at-article__h3">| </View>
<View className="at-article__p">
🚫广
<br />
🚫
<br />
<br />
,@
{/* <br />
💰价格29元/人 (场地成本) */}
</View>
<br />
{meetup == 1 ? (
<View className="at-article__h3">| 入群口令:3399</View>
) : null}
{meetup == 1 ? (
<View className="at-article__p">
{`ID:${window.localStorage.getItem("openid")}`}
</View>
) : null}
{/* 已报名 */}
{meetup == 1 ? (
<View className="model-emoji">
<Image
style="width: 240px;height: 240px;background: #fff;"
// src={qrcode}
src={joinGroup}
/>
</View>
) : null}
</View>
</View>
</View>
<View className="bottomDiv"></View>
{/* 判断有没有wxid,是否女性 */}
<AtButton
type="primary"
size="normal"
className="joinSalon"
onClick={() => {
if (meetup == 1) {
return false;
} else {
if (!!isWeChat) {
payh5("meetup", 2900);
} else {
setmeetupQR(true);
}
}
}}
>
{meetup == 1 ? "入群口令: 3399" : `立即加入`}
</AtButton>
<View className="meetupQR">
{/* 软件下载模态窗 */}
<AtModal isOpened={meetupQR}>
<AtModalHeader></AtModalHeader>
<AtModalContent>
<View className="model-emoji">
<Image
// style="width: 100%;height: 240px;background: #fff;"
src={qrcode}
/>
</View>
</AtModalContent>
<AtModalAction>
<Button
onClick={() => {
setmeetupQR(false);
}}
>
</Button>
</AtModalAction>
</AtModal>
</View>
</View>
);
};
export default Salon;

View File

@@ -1,3 +1,3 @@
export default {
navigationBarTitleText: '副业沙龙'
navigationBarTitleText: '异度星球'
}

View File

@@ -11,7 +11,10 @@
// position: relative;
bottom: 20px;
position: fixed;
width: 680px;
width: 700px;
font-weight: 600;
background-color:#72D572 ;
border-color: #72D572 ;;
}
.model-emoji {
@@ -21,3 +24,12 @@
justify-content: center;
}
}
.no-border {
border: none;
overflow: hidden;
width: 100%;
height: 100vh;
scrollbar-width: none; /* Firefox */
}

View File

@@ -25,6 +25,7 @@ import {
} from "taro-ui";
import qrcode from "../../images/qrcode.png";
import joinGroup from "../../images/joinGroup.png";
// export default class Index extends Component {
const Salon = () => {
@@ -36,12 +37,12 @@ const Salon = () => {
isWeChatFun();
}, []);
const handleClick = (value) => {
// 跳转到目的页面,在当前页面打开
Taro.navigateTo({
url: "/pages/index/index",
});
};
// const handleClick = (value) => {
// // 跳转到目的页面,在当前页面打开
// Taro.navigateTo({
// url: "/pages/index/index",
// });
// };
// 是否在微信客户端
const isWeChatFun = () => {
@@ -59,8 +60,8 @@ const Salon = () => {
// console.log("111");
Taro.request({
method: "POST",
url: "/api/payh5", //仅为示例,并非真实的接口地址
// url: "https://pay.hackrobot.cn/api/payh5", //仅为示例,并非真实的接口地址
url: `${process.env.TARO_API_API}/payh5`, //仅为示例,并非真实的接口地址
// url: "https://pay.hackrobot.cn${process.env.TARO_API_API}/payh5", //仅为示例,并非真实的接口地址
data: {
callback_url: window.location.href,
@@ -104,95 +105,123 @@ const Salon = () => {
<Image style="width: 100%;height: 100px;background: #fff;" src={loft} />
</View>
<View className="at-article">
<View className="at-article__h1"> | </View>
<View className="at-article__info">
{/* 2017-05-07&nbsp;&nbsp;&nbsp; */}
</View>
<View className="at-article__content">
<View className="at-article__section">
<View className="at-article__h2"></View>
<View className="at-article__h3">| 📣coffeechat</View>
<View className="at-article__p">
coffeechat的另一种形式,1V1交流会紧张,,(6),
</View>
<br />
<View className="at-article__h3">| 📋</View>
<View className="at-article__p">
<br />
1地点:龙华区--宿
<br />
26
<br />
3
</View>
<br />
<View className="at-article__h3">| ,</View>
<View className="at-article__p">
🚫广
<br />
🚫:"留学海归""博士硕士""大咖大V""大厂"
<br />
:"一人公司","自由职业","副业",,,,"高端XX局",,,.{" "}
<br />
<br />
,"职业/学历/成就"--
<br />
💰29/ ()
</View>
<br />
{meetup == 1 ? (
<View className="at-article__h3">| ,</View>
) : (
null
)}
{meetup == 1 ? (
{meetup != 1 ? (
<View className="at-article">
<View className="at-article__h1"></View>
<View className="at-article__info">
{/* 2017-05-07&nbsp;&nbsp;&nbsp; */}
</View>
<View className="at-article__content">
<View className="at-article__section">
<View className="at-article__h2"></View>
<View className="at-article__h3">| 📣</View>
<View className="at-article__p">
{`ID:${window.localStorage.getItem("openid")}`}
{/* 微信群是一个交流技术的平台,不限软件/硬件 */}
<br />
<br />
{/* <br />
长期更新 */}
</View>
) : null}
{/* 已报名 */}
{meetup == 1 ? (
<View className="model-emoji">
<Image
style="width: 240px;height: 240px;background: #fff;"
// src={qrcode}
src={nomadvloglife}
/>
<br />
<View className="at-article__h3">| 📋</View>
<View className="at-article__p">
{/* 微信群只是一个沟通平台,与其他伙伴搭桥
<br /> */}
:
<br />
1
<br />
2
<br />
3AIGC /
</View>
) : null}
<br />
<View className="at-article__h3">| 🟩</View>
<View className="at-article__p">
{/* 『微信群』是一个沟通平台,
<br />
加入后,会显示『入群口令』
<br /> */}
</View>
<br />
<View className="at-article__h3">| 🔊</View>
<View className="at-article__p">
🚫广
<br />
{/* 🚫恶意捣乱
<br />
<br /> */}
@群主
</View>
<br />
</View>
</View>
</View>
</View>
) : (
<View>
<View>
<View className="at-article__h3">| :<span style={{color:"red"}}>3399</span></View>
<View className="at-article__p">
{`ID:${window.localStorage.getItem("openid")}`}
</View>
<View className="model-emoji">
<Image
// style="width: 100%;height: 240px;background: #fff;"
src={qrcode}
/>
</View>
<View className="model-emoji">
<Image
style="width: 240px;height: 240px;background: #fff;"
// src={qrcode}
src={joinGroup}
/>
</View>
</View>
{/* webview=社区 */}
{/* <iframe
className="no-border"
src="https://memos.nomadcna.com/"
></iframe> */}
</View>
)}
<View className="bottomDiv"></View>
{/* 判断有没有wxid,是否女性 */}
<AtButton
type="primary"
size="normal"
className="joinSalon"
onClick={() => {
if (meetup == 1) {
return false;
} else {
if (!!isWeChat) {
payh5("meetup", 2900);
{meetup != 1 ? (
<AtButton
type="primary"
size="normal"
className="joinSalon"
onClick={() => {
if (meetup == 1) {
return false;
} else {
setmeetupQR(true);
if (!!isWeChat) {
// 1元
payh5("meetup", 100);
} else {
setmeetupQR(true);
}
}
}
}}
>
{meetup == 1 ? "已报名" : `立即报名`}
</AtButton>
}}
>
{/* {meetup == 1 ? "已加入" : `立即加入`} */}
{`立即加入 ¥1`}
</AtButton>
) : null}
<View className="meetupQR">
{/* 软件下载模态窗 */}
<AtModal isOpened={meetupQR}>
<AtModalHeader></AtModalHeader>
<AtModalHeader></AtModalHeader>
<AtModalContent>
<View className="model-emoji">
<Image

View File

@@ -0,0 +1,3 @@
export default {
navigationBarTitleText: '云手机'
}

View File

@@ -0,0 +1,37 @@
// 在 src/index.scss 中引入 GitHub Markdown 主题
@import 'github-markdown-css/github-markdown.css';
.Sphone {
padding: 40px;
// font-size: 30px !important;
// color: #666;
.markdown-body{
font-size: 30px !important;
}
img {
max-width: 100%;
height: auto; /* 保持图像的纵横比 */
}
.formCode {
display: flex;
flex-direction: row;
.codeBtn {
background-color: aquamarine;
// height: 80px;
// color: red;
}
}
.joinSalon {
// position: relative;
// bottom: 20px;
// position: fixed;
width: 700px;
font-weight: 600;
background-color:#72D572 ;
border-color: #72D572 ;;
}
}

151
src/pages/sphone/index.tsx Normal file
View File

@@ -0,0 +1,151 @@
// @ts-nocheck
import { Component } from "react";
import { View, Text, Image } from "@tarojs/components";
import "./index.scss";
import { AtButton, AtInput, AtTabBar } from "taro-ui";
import React, { useCallback, useEffect, useState } from "react";
import { AtGrid } from "taro-ui";
import { Swiper, SwiperItem } from "@tarojs/components";
import { AtCard } from "taro-ui";
import { AtImagePicker } from "taro-ui";
import Taro from "@tarojs/taro";
import { AtAvatar } from "taro-ui";
import { AtTag } from "taro-ui";
import { AtList, AtListItem } from "taro-ui";
import { AtForm, AtMessage } from "taro-ui";
import { marked } from "marked";
import infoText from "./info.md";
import payText from "./pay.md";
marked.setOptions({
breaks: true, // 是否回车换行
gfm: true, //使用经批准的 GitHub Flavored Markdown (GFM) 规范
// pedantic: true, //严格模式
// highlight(code:any, lang:any) {
// // 语法高亮
// let val = code;
// if (lang) {
// val = hljs.highlight(lang, code).value;
// } else {
// val = hljs.highlightAuto(code).value;
// }
// return val;
// },
});
// const renderer = new marked.Renderer();
// // 使用拓展
// marked.use({ renderer });
// export default class Index extends Component {
const Sphone = () => {
const [markText, setmarkText] = useState();
const [isWeChat, setisWeChat] = useState(false);
const [sphone, setsphone] = useState(window.localStorage.getItem("sphone"));
useEffect(() => {
isWeChatFun();
}, []);
// const handleClick = (value) => {
// // 跳转到目的页面,在当前页面打开
// Taro.navigateTo({
// url: "/pages/index/index",
// });
// };
// 是否在微信客户端
const isWeChatFun = () => {
var ua = navigator.userAgent.toLowerCase();
if (ua.indexOf("micromessenger") != -1) {
setisWeChat(true);
return true;
} else {
setisWeChat(false);
return false;
}
};
const payh5 = (type, total_fee = 1000) => {
// console.log("111");
Taro.request({
method: "POST",
url: `${process.env.TARO_API_API}/payh5`, //仅为示例,并非真实的接口地址
// url: "https://pay.hackrobot.cn${process.env.TARO_API_API}/payh5", //仅为示例,并非真实的接口地址
data: {
callback_url: window.location.href,
openid: window.localStorage.getItem("openid"),
total_fee: total_fee, // 金额,单位:分
type: type, //订单类型 sphone/meetup/video/vip
},
header: {
"content-type": "application/json", // 默认值
},
success: function (res) {
console.log(res.data);
// window.alert(res.data.jsapi);
WeixinJSBridge.invoke(
"getBrandWCPayRequest",
{
// 以下6个支付参数通过payjs的jsapi接口获取
// appId: "wxc5205a653b0259bf",
// timeStamp: "1701401644",
// nonceStr: "KhOYB0wFV6j9qyQK",
// package: "prepay_id=wx01113404850024729b35f4d69b73500000",
// signType: "MD5",
// paySign: "2A823C8D47CCF871C6C65A56DC228CF8",
...(res?.data?.jsapi ?? {}),
},
function (res) {
// 支付成功
if (res.err_msg == "get_brand_wcpay_request:ok") {
window.localStorage.setItem(type, 1); //订单类型 sphone/meetup/video/vip
WeixinJSBridge.call("closeWindow");
}
}
);
},
});
};
return (
<View className="Sphone">
<View
className="markdown-body" // 添加 GitHub Markdown 主题类
dangerouslySetInnerHTML={{
__html: marked(sphone == 1 ? payText : infoText),
}}
></View>
<View className="bottomDiv"></View>
{/* 判断有没有wxid,是否女性 */}
{sphone != 1 ? (
<AtButton
type="primary"
size="normal"
className="joinSalon"
onClick={() => {
if (sphone == 1) {
return false;
} else {
if (!!isWeChat) {
// 180元
payh5("sphone", 18000);
} else {
// setmeetupQR(true);
}
}
}}
>
{/* {meetup == 1 ? "已加入" : `立即加入`} */}
{`阅读更多 ¥180`}
</AtButton>
) : null}
</View>
);
};
export default Sphone;

51
src/pages/sphone/info.md Normal file
View File

@@ -0,0 +1,51 @@
## 云手机教程
> docker部署
![2024-12-22-01-00-03-Escrcpy.png](https://hackrobot-1258475618.cos.ap-shenzhen-fsi.myqcloud.com/2024-12-22-01-00-03-Escrcpy.png?imageSlim)
> 原生安卓AOSP
![2025-01-06-01-40-05-EscrcpyMirror-rk3588_s(WIFI).png](https://hackrobot-1258475618.cos.ap-shenzhen-fsi.myqcloud.com/2025-01-06-01-40-05-EscrcpyMirror-rk3588_s(WIFI).png?imageSlim)
***
## 目录
- 云手机设备指北
- 硬件选型
- 方案1:docker容器化安卓
- 虚拟化的优缺点/设置
- 方案2:主板+原生AOSP
- root权限与magisk配置
- OTG外设配件
- 内网穿透
- 远程控制:云控
- 魔法:多开/群控/应用变量/gps/ip属地
- 应用场景:无人直播/机器人bot/RPA自动化+数据爬虫
- 杂谈~~
***
## 简述
教程属于`操作类,不是原理`
比如不涉及:内核编译,ROM定制,虚拟化
图文+视频录制
长期更新

79
src/pages/sphone/pay.md Normal file
View File

@@ -0,0 +1,79 @@
## 云手机教程
> docker部署
![2024-12-22-01-00-03-Escrcpy.png](https://hackrobot-1258475618.cos.ap-shenzhen-fsi.myqcloud.com/2024-12-22-01-00-03-Escrcpy.png?imageSlim)
> 原生安卓AOSP
![2025-01-06-01-40-05-EscrcpyMirror-rk3588_s(WIFI).png](https://hackrobot-1258475618.cos.ap-shenzhen-fsi.myqcloud.com/2025-01-06-01-40-05-EscrcpyMirror-rk3588_s(WIFI).png?imageSlim)
***
## 目录
- 云手机设备指北
- 硬件选型
- 方案1:docker容器化安卓
- 虚拟化的优缺点/设置
- 方案2:主板+原生AOSP
- root权限与magisk配置
- OTG外设配件
- 内网穿透
- 远程控制:云控
- 魔法:多开/群控/应用变量/gps/ip属地
- 应用场景:无人直播/机器人bot/RPA自动化+数据爬虫
- 杂谈~~
***
## 简述
教程属于`操作类,不是原理`
比如不涉及:内核编译,ROM定制,虚拟化
图文+视频录制
长期更新
***
## 云手机设备指北
这里说的云手机,默认指的
1. 开源硬件:ARM主板,
2. 设置安卓系统
3. 远程控制
***
## 硬件选型
建议购买RK3588芯片的开发板
- 香橙派5plus
- nvme ssd硬盘
- TF卡:用于测试系统
- 2个支持`uvc协议+带麦克风`的摄像头
教程正在更新中,视频录制操作过程,请等待

View File

@@ -1653,7 +1653,7 @@
"@tarojs/api@3.6.20":
version "3.6.20"
resolved "https://registry.npmmirror.com/@tarojs/api/-/api-3.6.20.tgz#75198d1c0c8a78a896d234b368a5a69a6cff8114"
resolved "https://registry.npmmirror.com/@tarojs${process.env.TARO_API_API}/-/api-3.6.20.tgz#75198d1c0c8a78a896d234b368a5a69a6cff8114"
integrity sha512-LJLYthePWUsq+Xy7IqUKv29BI1is1K861oagGVoQW6xYyLnvQx4zwU4FwlttvkA0iOtSGKf9q/KdTmheeeVrJQ==
dependencies:
"@babel/runtime" "^7.14.5"