规则之树 https://www.ruletree.club/ zh-CN 规则之树创建于2017年,由简单的个人技术小站,发展为综合性的文章内容博客,主要分享各类技术教程,互联网评测,原创小说文章等内容。一直以来,我们都在收集知识,创造知识,在互联网的潮流之中努力前行。 Mon, 29 Jan 2024 11:53:00 +0800 Mon, 29 Jan 2024 11:53:00 +0800 关于永久拉黑“帮帮乐”,并解除其Pro授权的通知 https://www.ruletree.club/archives/3557/ https://www.ruletree.club/archives/3557/ Mon, 29 Jan 2024 11:53:00 +0800 不暇 发布这篇文章是想要让所有Ruleproject相关用户都知情这件事,以防更多人遭遇欺骗和财产损失,所以请务必点进来阅读。

首先,什么是“帮帮乐”?

这位的昵称和ID很多,但是他在自己的二开程序和对外宣称的售卖软件的名称就是“帮帮乐”。如下是他的一些信息:

微信号:sky20241314520

QQ号:3080205069

QQ号:2167250948

域名:jwglbbs.cn

咸鱼店铺名称:书院街登山半夏

总而言之,“帮帮乐”主要在提供Ruleproject二开、搭建(可能还有功能定制)等服务,到目前为止看起来很正常,而且他也是赞助了Pro版(非商业授权)的用户。

那么,我为什么要关于永久拉黑“帮帮乐”,并解除其Pro授权呢?

“帮帮乐”做了什么?

他做的事情很多,除了上面那些看起来正经的事情外,他还做了如下的事情:

1.让别人帮他二开功能,功能搞完了但是不给钱。

2.对外宣称有1088的pro商业版授权,欺骗别人去他那里购买Pro。

3.只是改了几个文字,就对外宣称Pro版被破解(然后参考第二条)。

4.在群里欺骗他人说自己的二开版有啥功能,别人找他购买后付了钱就跑路。

还有很多,以至于我在群里随便一问,就能冒出来好几个受害者。

总结来说,他从23年至今,欺骗和圈钱,就是大部分接触过他的人对他的评价。

我之前为什么不踢了“帮帮乐”?

其实我原本是打算直接踢了他,在几个月前的某一天。当时有三个不同的人找到我,说他怎么在进行欺骗,甚至有几位已经出现了财产损失,而且不说其他人,他在没有购买RuleProject的pro版商业授权的时候,公然在未经我允许对外出售Pro,并且有确凿的截图证据。然而“帮帮乐”本人找到了我,让我不要踢了他,说愿意归还所有钱,并取得所有人谅解。

他当时的态度很诚恳,以现在他做的事情来看,诚恳得像个小丑一样。

就这样,当时他归还了钱,确认了所有人都谅解了他,所以我在交流群留下了他,但根据Pro用户投票移出了Pro用户群,仍然保留gitee项目可访问权限。

为什么现在要拉黑他

因为2024年1月28日他做了一件这样的事情。

首先面对新加群群友的时候,在群里谎称自己的二开版本有短信宝功能,而在对方支付50元之后,立刻拉黑了对方并直接退群。

我其实本来不想写公开的文章,但是我看到了他在咸鱼对别人问题的回答。能把自己欺骗别人,拿到钱就拉黑退群,理直气壮的说成是别人的不对,几乎毫无愧疚之心。

20240129-121323.jpg

操作之熟练,话术之完善,让我对这个人彻底失望,那么也可以表明,哪怕几个月前的他像小丑一样态度诚恳,但是这几个月来,他本质仍然没有变化,甚至一直在利用RuleProject不断的欺骗和圈钱,而且也完全违背他自己立下的约定,也直接违RuleProject用户协议。

所以,从昨天起,RuleProject所有社群,包括github和gitee,永久拉黑“帮帮乐”,并撤销对其的Pro授权。我不再对其提供任何支持与维护,我也收回自己的个人软件著作权根据中国版权法对其所赋予的Pro版使用权,他基于RuleProject Pro所作的一切行为都视为不合法。

我希望每个看到这篇文章的人都请小心谨慎,不要被欺骗而遭受财产损失。

]]>
5 https://www.ruletree.club/archives/3557/#comments https://www.ruletree.club/feed/archives/3557/
2023留言送书活动,这次算总集篇 https://www.ruletree.club/archives/3523/ https://www.ruletree.club/archives/3523/ Mon, 25 Dec 2023 18:20:00 +0800 不暇 在之前的几年,已经有了两次送书活动,本来我还想搞成年度活动的,但是奈何自己水平有限,写作方面进展不大。不过我想了又想,还是决定再搞一次,就当作是一个总集篇一样,也算是满足一些小小的私心,就是希望有更多人看到我的作品。::(酷)

本次送书活动将有两本书,和之前一样的科幻合集,里面有各种名家的作品,而我的作品也在其中。

在这里特别感谢编辑能给我这样的机会,由衷感谢您。

本年活动的规则和之前一样,直接在评论区回复任意的感想和内容。另外,我的网站不需要注册用户,只需要填写邮箱和昵称即可发言

然后,我会从评论区随机选出3位,赠送如下两本合集。

参与人数过多,重新更修正,增加为5位,将选出5位幸运评论者,送出如下两本书。

screenshot-20231226-142203.png

我的作品是《后人类纪》合集中的《蝶蛹》,和地球大炮合集中的《请你闭上眼》,欢迎前往阅读。

本次活动持续到1月1日,结果出来后,我会在文章内公布,并且每个人都发邮件私聊。

抽奖结果

恭喜如下评论者获得本年留言送书活动奖品,我会将获奖邮件发送到你们的邮箱,如果没有收到,也可以直接来官方群私聊我。
screenshot-20240102-112233.png
screenshot-20240102-112255.png
screenshot-20240102-112330.png
screenshot-20240102-112352.png
screenshot-20240102-112404.png

最后,我的网站存在缓存,而且评论需要审核,发送评论后如果不显示是正常情况,可过十分钟再看看是否存在。

感谢大家的支持,也希望各位踊跃发言。

]]>
40 https://www.ruletree.club/archives/3523/#comments https://www.ruletree.club/feed/archives/3523/
免费无限制AI绘图,并上架NFT,支持中文描述及关键词 https://www.ruletree.club/archives/3461/ https://www.ruletree.club/archives/3461/ Thu, 17 Aug 2023 12:29:00 +0800 不暇 本文非推广,因为说实话我也有点惊讶,没想到行业里居然玩得这么花。事情是这样的,上次那个开国外信用卡的教程不是需要买币嘛,然后我在那个软件瞎点,结果发现了如下的东西。

20230817-122620.jpg
20230817-124435.jpg
20230817-122517.jpg
:@(呆滞)当时我就惊了,怎么这玩意还能AI绘画?

抱着试一试的心态,我尝试了以下,走完了全部的流程,所以整理出这篇教程。

写在开头

首先,我也很无语,因为这个软件就是上次说的OKE,这玩意是数字货币的平台,但是它的WEB3模块里有一个AI绘图功能,这个功能是免费的,而且在完成AI绘图后,可以立即上架到NFT售卖,等冤大头购买。

所以,不要炒币!!!本文是教大家怎么撸这个免费AI绘图的羊毛,并且上架NFT看能不能白嫖币。

教程开始

1.这个网站国内有时候能进,有时候进不去,所以建议挂梯子操作,另外,注册完成后,请下载APP并登录。记得,AI绘图的功能不在它的主站里,不要去用主站的功能。

注册地址:点击进入

2.无视主站的各种提示,注册用户后,直接安装APP,点击首页的Web3
20230817-123407.jpg

第一次进入,会提示你创建钱包,你就点击快捷创建-创建无私钥钱包,直接挂载在你的账号底下,然后它会提示你备份钱包,直接按提示备份就好。完成这些操作后,点击上图所示的市场。

首页还可以白嫖一个纪念章NFT(我也不知道有什么用,但是白嫖的东西不要白不要)

3.在市场里找到AI创作。

20230817-123715.jpg
然后,就进入了免费的AI创作页面,我试了以下,免费不限次数的生成图片,提供30多种引擎,但是一次只能生成一张。

用中文输入描述文字和创建词之后,就可以开始生成图片了,生成的图片可以直接点击发布到NFT市场,并且勾选铸造费买家出。流程按照下图所示。

20230817-122034.jpg

首先选择引擎,输入描述,然后开始生成图片。

20230817-124617.jpg
20230817-124621.jpg
对图片满意的话,就可以发布为nft,输入标题和描述,勾选免费铸造。

20230817-124737.jpg
20230817-124746.jpg
20230817-124752.jpg

发布完成后,你的AI作品就成为了NFT艺术品,可以上架售卖,也可以在资产中查看。
20230817-124435.jpg

最后

本质上,就是OKE把AI绘图和Web3功能整合了,虽然你创作的AI图片不一定有人买,而且买你的还要帮你垫付铸造费,但是好歹,你白嫖了一个30多个引擎的AI绘图工具。另外这里也支持发布自己创作的图片,看有没有人交易。

不过还是那句话,我们是来撸羊毛的,别去炒币,水太深了。

我之前的文章也用到了oke,感兴趣也可以去看看

无需外国人身份,开通美国或香港信用卡,订阅chatgpt或绑定支付宝微信

]]>
2 https://www.ruletree.club/archives/3461/#comments https://www.ruletree.club/feed/archives/3461/
无需外国人身份,开通美国或香港信用卡,订阅chatgpt或绑定支付宝微信 https://www.ruletree.club/archives/3448/ https://www.ruletree.club/archives/3448/ Sun, 09 Jul 2023 11:23:00 +0800 不暇 大多数人买国外的东西,比如买服务器域名啊,或者注册亚马逊啊,都会遇到一个很要命的问题,就是它需要信用卡,而且是国外的信用卡,这就直接导致很多可以白嫖或者很好用的东西,直接就没办法去买了。好在,实际上是由平台提供虚拟信用卡服务的,流程很简单,充值数字货币和提交实名认证,就可以直接开通,最早的平台是Depay,但可惜的是近期它已经停止新用户注册。

最近我看到有一个新的平台支持了虚拟海外信用卡,叫做OneKey Card,目前支持美国和香港两个地区,自己亲自试了一下,已经开通成功,所以还是整理一个教程吧。

根据OneKey Card官方的说法,卡片是不限额不冻结的,可以尽情用。

20230709-110412.jpg

因为都是国外的网站,建议挂梯子操作。

并且,本文不做对数字货币的推广,仅仅是教怎么开通国外虚拟银行卡。这些平台全TM数字货币收款,我也很绝望。

总之,我们是开信用卡的,请别炒币,全是坑。

注册地址:点击进入
现在这个坑爹平台需要邀请码才能注册,如果提示需要邀请码,就填这个:6N24G3

前期准备:

1.首先,我整理一下需要哪些费用,这样如果没钱的,可以没必要往下看了。

充值的USDT就等于卡的额度,每次最低充值额度30USDT(约等于人民币210元),不过去除开卡费用后,剩下的钱变成卡的可用额度。
刚开通卡的需要每个月1美元月费,从前面的30美元中扣除
初级卡非USD或者HKD交易会有1.25%的手续费

2.为了方便操作,要准备如下的东西和知识点

1.谷歌账号(直接注册就行)
2.数字货币,可以去OKE用人民币买USDT
3.OneKey充值选择TRC20,OKE提现也选择TRC20,因为手续费低,而且快,但是选择错误了就是全损,无法找回,切记。

教程开启

1.进入OneKey通过谷歌账号注册,然后直接点击首页的激活卡片。

screenshot-20230709-110559.png

screenshot-20230709-110700.png

2.根据提示完成实名认证,只要上传身份证正反面照片,然后扫码二维码完成人脸识别。完成之后,再点击开通卡片,就会提示您选择卡片,根据你的需求选择就好。如果你要订阅chatgpt,或者亚马逊,就选择美国卡,如果你是要绑定支付宝微信,普通的买国外服务器之类的,就选择香港卡。
20230709-110412.jpg

3.选择卡片后,会提示需要激活,这里有个坑爹的地方是,激活是1美元,但最低充值时30美元,切记,低于30USDT的充值直接不到账。选择完成后,就会给你充值二维码和收款地址。
20230709-111049.jpg
4.点击充值后,它会让你选择充值币种和公链,就选择USDT币种和TRC20公链。然后数字货币可以去OKE购买,进入OKE首页,直接点击买币,就可以用人民币买币了。不要买太多,因为手续费可能的问题,保险起见可以买32USDT,买完了直接提币。

OKE注册地址:点击进入

20230709-111401.jpg
5.提币选择链上提币。然后就是填入第三步中OneKey给的TRC充值地址,所以OKE这边就选择TRC20,填OneKey给的充值地址。这里千万不要填错了,数字货币就是地址和公链错了就无法找回。

20230709-111832.jpg
6.提币完成后,等待10分钟左右,刷新首页,可以看到信用卡开通成功,官方也会给教程教你绑定微信,支付宝。也可以自己去绑定贝宝之类的国外支付。
20230709-112126.jpg

7.如果还需要卡片,就再添加就好了,钱会从已有的卡片扣除。

最后

我是因为国内银行卡被限制交易,导致PayPal用不了,然后听别人说了Depay,结果很遗憾Depay停止注册,最后才无意间发现OneKey Card,上面的截图都是亲自走完了流程,如有疑问可以评论区留言。

]]>
5 https://www.ruletree.club/archives/3448/#comments https://www.ruletree.club/feed/archives/3448/
NuxtJS2图片加载优化,预缓存和调用 https://www.ruletree.club/archives/3432/ https://www.ruletree.club/archives/3432/ Wed, 14 Jun 2023 12:19:00 +0800 不暇 依然是上次那个项目,因为是一个客户端(但是又要求在线访问),所以图片加载首先就遇到了两个问题。一是图片质量大而且多,页面加载会卡顿,二是页面切换的时候,网络不好会加载半天的时间,我想了很久,最后决定要在进入在线网页首页的时候,搞一个加载条,加载完图片的时候,再打开网页。
NuxtJS
那么,就会用到图片预加载,实现起来不难,具体代码如下:

1.创建一个标准的vue页面,在data部分加入要缓存的图片数组。

imageSources: [
  "/img/1.png",
  "/img/2.png",
  "/img/3.png",
  "/img/4.png",
  "/img/5.png",
  "/img/6.png",
  "/img/7.png"
]

2.在methods中创建缓存方法:

  preloadImages() {
    const that = this;
    const promises = []

    for (let i = 0; i < this.imageSources.length; i++) {
      const img = new Image()
      const promise = new Promise((resolve, reject) => {
        img.onload = resolve
        img.onerror = reject
      })

      img.src = this.imageSources[i]
      promises.push(promise)
    }

    Promise.all(promises)
      .then(() => {
        //图片缓存完成后,执行其它操作
        
      })
      .catch(error => {
        console.error(error)
      })
  },

3.在起始的页面上,调用缓存方法,这里可以提前搞一个进度条或者加载图啥的,让用户知道加载过程,加载完了关闭就好。

that.preloadImages();

4.上述操作完成后,图片将被缓存到内存中,直接引用这些路径调用即可,不需要额外的代码。实际效果非常好,只要完成了起始页加载,后面的图片都会直接显示,而不需要加载。

]]>
3 https://www.ruletree.club/archives/3432/#comments https://www.ruletree.club/feed/archives/3432/
NuxtJS2实现无卡顿高性能的音频播放 https://www.ruletree.club/archives/3420/ https://www.ruletree.club/archives/3420/ Wed, 14 Jun 2023 12:11:00 +0800 不暇 之前项目的时候,遇到一个这样的需求,一是要求一个网页有背景音乐播放,并且切换页面的时候不中断,二是每个按钮点击都需要有音效。乍一看很简单,只需要在页面上创建audio标签,然后在js里调用播放。
但是实际上,当我引入了背景音乐,鼠标音效之后,网页在进来的瞬间直接卡到起飞,直接导致浏览器未响应,就算音频加载完成了,也会导致用户在进行每个操作的时候都会异常卡顿,所以,就必须找到新的方法来解决这个问题。
nuxtJS

具体原因

因为在音频标签在引入后,浏览器加载时,会直接同时解析所有的音频,导致浏览器卡顿。所以需要将所有音频预加载,先存储到内存中。

代码案例

1.对于背景音乐,可以使用预加载办法,提前存储到内存中,避免加载和解析导致的卡顿,具体代码如下。

import Vue from 'vue'
//加载背景音乐
const audioUrls = ['/mp3/home-bg.mp3', '/mp3/start-bg.mp3']
const audioMap = {}
for (const url of audioUrls) {
  const audio = new Audio()
  audio.src = url
  audio.load()
  audio.onloadeddata = () => {
    console.log(`音频 ${url} 加载完成`)
  }
  audioMap[url] = audio
}
Vue.prototype.$audioMap = audioMap;

在项目的plugins文件夹中创建bgAudio.js,放入上述代码,再进入项目的nuxt.config.js,找到plugins: []部分,加入如下代码:

 { src: '@/plugins/bgAudio.js', mode: 'client' },

调用背景音乐时,代码如下:

this.audio = that.$audioMap['/mp3/start-bg.mp3'];//定义音频对象
this.audio.loop = true; //设置循环播放
this.$audioMap['/mp3/home-bg.mp3'].pause() //暂停播放
this.$audioMap['/mp3/home-bg.mp3'].currentTime = 0 //从0秒开始播放
//其它的控制和一般的audio操作完全一致

这样,由于背景音乐直接js预加载到内存,需要的时候调用,就省略的浏览器加载解析的过程,就解决了一半的卡顿问题。然后,还可以用以下方法判断图片是否加载完成。

var audio1State =  this.$audioMap['/mp3/home-bg.mp3'].readyState;
//4就是加载完成,其它的百度查一下吧。

2.对于按钮点击音效,因为按钮操作会非常多,而且可能不同按钮音效不同,所以不能写死去预加载,而是灵活的进行调用。plugins文件夹中创建btnAudio.js,代码如下:

class AudioPlayer {
  constructor() {
    this.audioContext = null
    this.gainNode = null
    this.isPlaying = false
    this.currentSource = null
    this.audioBufferMap = {}
    this.initAudio()
  }

  initAudio() {
    //兼容iPhone旧版本
    if ('AudioContext' in window || 'webkitAudioContext' in window) {
      this.audioContext = new (window.AudioContext || window.webkitAudioContext)();
    } else {
      console.error('Web Audio API not supported');
    }
    this.gainNode = this.audioContext.createGain()
    this.gainNode.connect(this.audioContext.destination)
  }

  play(src, loop = false) {
    if (this.isPlaying) {
      this.stop()
    }

    if (this.audioBufferMap[src]) {
      this.playBuffer(this.audioBufferMap[src], loop)
    } else {
      let request = new XMLHttpRequest()
      request.open('GET', src, true)
      request.responseType = 'arraybuffer'

      request.onload = () => {
        this.audioContext.decodeAudioData(request.response, buffer => {
          this.audioBufferMap[src] = buffer
          this.playBuffer(buffer, loop)
        }, () => {
          console.error('decodeAudioData error')
        })
      }

      request.send()
    }
  }

  preload(src) {
    if (!this.audioBufferMap[src]) {
      let request = new XMLHttpRequest()
      request.open('GET', src, true)
      request.responseType = 'arraybuffer'

      request.onload = () => {
        this.audioContext.decodeAudioData(request.response, buffer => {
          this.audioBufferMap[src] = buffer
        }, () => {
          console.error('decodeAudioData error')
        })
      }

      request.send()
    }
  }

  playBuffer(buffer, loop) {
    this.currentSource = this.audioContext.createBufferSource()
    this.currentSource.buffer = buffer
    this.currentSource.loop = loop
    this.currentSource.connect(this.gainNode)
    this.currentSource.start(0)
    this.isPlaying = true
  }

  pause() {
    if (this.isPlaying && this.currentSource) {
      this.currentSource.stop(0)
      this.isPlaying = false
    }
  }

  stop() {
    if (this.isPlaying && this.currentSource) {
      this.currentSource.stop(0)
      this.isPlaying = false
    }
  }
}

const audioPlayer = new AudioPlayer()

export default ({ app }, inject) => {
  inject('audio', audioPlayer)
}

再进入项目的nuxt.config.js,找到plugins: []部分,加入如下代码:

{ src: '@/plugins/btnAudio.js', ssr: false },

调用按钮音效时,代码如下:

this.$audio.play('/mp3/click.wav')

也可以提前预加载,用如下代码:

this.$audio.preload('/mp3/click.wav')

这样,第一次点击按钮时,则加载音乐到存储,之后每次调用同样的文件时直接调用缓存。这样就解决了性能问题,

最后

NuxtJS2+VUE2配合起来,感觉非常适合开发桌面客户端,不过具体还在研究中。对于NuxtJS3,生态支持和文档都太少了,还是过段时间研究把。

]]>
1 https://www.ruletree.club/archives/3420/#comments https://www.ruletree.club/feed/archives/3420/
关于app中文章封面图不显示的问题及解决方法 https://www.ruletree.club/archives/3395/ https://www.ruletree.club/archives/3395/ Thu, 16 Feb 2023 02:16:51 +0800 一九三网赚博客 手动更新文章太慢,做了个一键采集
效率是上去了,突然发现文章封面图不显示

图片名称

但是文章中又显示正常,有点不太懂了

反反复复修改测试了好多次找到了问题

图片名称
上面这张图片就是封面图不显示的文章内容

图片名称
这是可以正常显示封面图文章内容

问题就是出在插入图片代码的结尾处
把插入图片的方式做成单独一行就解决问题了

具体是因为结尾处有html代码导致图片不显示还是因为插入图片代码必须要单独一行这个问题我忘记测试了,有知道原因的小伙伴麻烦说一下,感谢

]]>
8 https://www.ruletree.club/archives/3395/#comments https://www.ruletree.club/feed/archives/3395/
Ruleapp配置及Ruleapi安装视频教程 https://www.ruletree.club/archives/3372/ https://www.ruletree.club/archives/3372/ Thu, 22 Dec 2022 17:15:34 +0800 玖伍网络工作室 Ruleapi的安装教程及Ruleapp的配置教程!

视频中的笔记下载链接:

https://app.95cdk.cn/RyleappvRuleapi.zip

还有任何不懂的都可以评论区问我,同时我也提供有偿搭建服务,对于那些懒的又想做的人很友好,仅需66元/位,同时包括后期更新都是免费帮您更新!

版权所有:规则之树,我仅是提供搭建服务!

图片名称

]]>
10 https://www.ruletree.club/archives/3372/#comments https://www.ruletree.club/feed/archives/3372/
记录一下我不小心安装tomcat导致ruleapi打不开的问题 https://www.ruletree.club/archives/3371/ https://www.ruletree.club/archives/3371/ Tue, 20 Dec 2022 00:39:57 +0800 一九三网赚博客 因为ruleapi传输post字节过长就会出现失败,我想试试能不能解决一下这个问题
也怪自己没仔细看
图片名称
早都说明白了不能安装tomcat::(黑脸)::(黑脸)

这段时间各种重装ruleapi
重装网站
后来看到这一点
图片名称
图片名称

大佬说了,只要是java环境在1.8以上就没问题
刚开始出现网站打不开的问题也没往java环境上想

抱着试试看的态度查了一下服务器的java果然是1.7

妈呀,问题找到了,
接下来就是卸载java环境,然后安装1.8

问题完美解决!
截图忘记截了

大佬说得对,只要java环境在1.8以上基本上没什么问题
另外多看看教程,千万不要安装tomcat

]]>
0 https://www.ruletree.club/archives/3371/#comments https://www.ruletree.club/feed/archives/3371/
RuleApi二次开发入门教程,从修改到打包 https://www.ruletree.club/archives/3360/ https://www.ruletree.club/archives/3360/ Sun, 11 Dec 2022 17:20:00 +0800 不暇 这篇文章只讲述RuleApi如何进行简单的二次开发,并且在阅读前,请先在心理不断的强调一点,那就是这些东西没有什么难度,大多数甚至变通程度不如小学数学题,很多时候总是把简单的事情想成很困难是不好的。所以,在这篇文章,我会简单的讲解RuleApi代码的目录结构,如何创建新接口,如何修改旧接口,如何创建新数据库字段,如何让数据库语句可以执行。

虽然说不需要懂太多,但是编程的基本思想要有,比如知道什么是接口,什么是参数,什么是数据库,如果这里不知道,那么这篇文章就没有看下去的意义了。

如果是二次开发进行商业售卖,请申明基于RuleApi。开源不易,如果你觉得好用的话,可以通过下方链接赞助。

赞助开发者

提示

我已经在语雀补充了更加详细的文档,建议前往阅读:RuleProject社区应用帮助文档

注意

1.虽然RuleApi是通过Java语言的Springboot框架开发,但是不等于要学会java,甚至根本用不到什么java知识,全程都可以复制粘贴,简单修改。

2.我的代码是属于一边学一边做,可能有很大的优化空间,如果技术好点的情况下,可以自己发挥能力大改。

3.每次修改完都需要重启才生效,这里和php或者前端都是不一样的。

4.JAVA属于强类型语言,所以各种类型需要做好申明,类型有时候也需要转换,但是百度有一大堆教程。

前期准备:

请根据如下教程,跳过代码的部分,只看安装基本环境部分,安装好JAVA环境,Redis还有一堆文章内提供的工具,包括IDEA。其它的代码啊,java教程啥的,就别看了,和他们无关。
Springboot半小时入门教程,代码加案例,新手摸坑大全

目录结构

如下图所示,通过IDEA导入项目,打开项目的src/main/java就可以看到代码目录了。最重要的文件夹是web,放入了所有接口和主要逻辑,其次就是common文件夹放的公共方法,然后就是mapper里面的xml形式的数据库语句,和static里面的接口网页和可视化配置中心。
1.png

IDEA基本操作

1.启动项项目:导入项目后,开启本地的各类环境,如Redis和Mysql之后,可点击如下图所示的方法启动项目。打开后可通过127.0.0.1:8081访问,如果要改端口,可以打开resources目录下的application.properties文件。

2.png

2.修改完后打包项目:在右边可以看到竖起来的Maven,点击后如下图所示,双击package即可开始打包,打包的jar文件会出现在/RuleApi/target目录,这时候只需要把这个jar文件修改名称,替换你服务器opt目录下的jar文件,就可以运行重启指令,开始你的二开版本了。
3.png
4.png

2.修复错误:如果你的项目出现问题,最常见的就是代码错误,或者多了标点符号,这个时候将无法打包,但是IDEA会准确的告诉你在哪个文件和哪一行以及具体位置,这时就需要你自己找到修复。
5.png

修改旧接口

如果你需要对已有的接口进行修改,那么可以首先看接口的路径,比如/typechoUsers/userInfo。因为所有的接口都在web目录,这个目录可以理解为控制器,所以只需要找对应名称的文件即可,比如我找到了TypechoUsersController,如下图所示。另外申明一点,我所有的代码实际上都演示了很多案例,可以自己复制粘贴来做修改
6.png

其中的一些重要的代码含义如下:

@RequestMapping(value = "/userInfo")   //定义接口路径
@RequestParam(value = "key", required = false) String key  //接收一个名为key的参数
TypechoUsers info = service.selectByKey(key);  //通过key拿到这个用户的所有信息。

service相当于调用数据库的执行方法,比如selectByKey就代表主键查询,根据用户ID查询所有信息,具体可以打开mapper文件夹的所有XML文件,查看具体的注释,如下图所示。
7.png

而service可以调用所有模块的数据库语句,如用户模块,文章模块,评论模块,具体需要去看TypechoUsersController的头部代码,如下图所示:

@Autowired
TypechoUsersService service;  //调用本模块(用户模块)数据库方法
@Autowired
private TypechoContentsService contentsService;   //调用文章模块数据库方法
@Autowired
private TypechoCommentsService commentsService;  //调用评论模块数据库方法

有了数据库的方法,然后还需要一些常用的方法来复制和使用,如下所示:

判断是否登录

需要在这个接口里,加入如下的参数接收

@RequestParam(value = "key", required = false) String key

然后就可以用如下代码判断登录状态

Integer uStatus = UStatus.getStatus(token,this.dataprefix,redisTemplate);
if(uStatus==0){
    return Result.getResultJson(0,"用户未登录或Token验证失败",null);
}

获取当前登录用户信息

map拿出所有的信息,map里面就可以拿到各种字段信息。

Map map =redisHelp.getMapValue(this.dataprefix+"_"+"userInfo"+token,redisTemplate);
Integer uid  = Integer.parseInt(map.get("uid").toString());  //拿到用户id
String group = map.get("group").toString();  //拿到用户权限组,和typecho一致。

存入Redis和取出Redis

这里可以参考我的列表接口和详情接口,里面提供了具体的存入,判断,取出案例,这里不做多概述。核心就是反正代码写错了电脑又不会爆炸,大不了还原重来。

调用全局方法

在TypechoUsersController的头部,还可以找到如下代码,这些都是定义的全局方法,他们都在common文件夹中。

RedisHelp redisHelp = new RedisHelp();
ResultAll Result = new ResultAll();
baseFull baseFull = new baseFull();
UserStatus UStatus = new UserStatus();
HttpClient HttpClient = new HttpClient();
PHPass phpass = new PHPass(8);

他们的用法可以搜索查看,比如redisHelp负责存取redis数据,Result负责返回接口数据,baseFull定义了一堆常用方法,UStatus判断用户登录状态,HttpClient负责接口端发送请求,phpass负责密码的加密和验证。直接搜索代码或者打开文件看注释就可以看到用法。

添加新接口

你可以选择在web下已有的文件中添加接口,比如在TypechoUsersController中,访问就是如下所示:

/typechoUsers/新接口路径

具体的代码参考如下:

@RequestMapping(value = "/newUrl")
@ResponseBody
public String newUrl() {
    response.put("code" , 1);
    response.put("data" , "这是数据");
    response.put("msg"  , "这是提示");
    return response.toString();
}

如果你需要添加新的模块,那么可以直接在web文件夹下,以其它文件名称的格式创建新文件,内部的代码可以直接先复制,就像install和pay开头的那两个文件一样。先定义一级路径访问,再开始创建二级路径方法。

进阶教程

这里将演示一些实际的进阶案例。

添加一个数据库字段

如果要添加一个数据库字段,那么主要有三个文件要改,一是web下的InstallController,在安装方法newInstall里,就可以看到更新和安装的所有数据库语句,因为你需要增加一个可以修改值的字段,那么就肯定需要让安装和更新也支持这个新字段。如下案例所示(更多可以直接参考InstallController内写法)

    //查询文章表是否存在likes字段
    i = jdbcTemplate.queryForObject("select count(*) from information_schema.columns where table_name = '"+prefix+"_contents' and column_name = 'likes';", Integer.class);
    if (i == 0){
        jdbcTemplate.execute("alter table "+prefix+"_contents ADD likes integer(10) DEFAULT 0;");
        text+="内容模块,字段likes添加完成。";
    }else{
        text+="内容模块,字段likes已经存在,无需添加。";
    }

然后修改类文件,比如我是给文章表增加了字段,那就是需要entity下的文章类TypechoContents里增加一个对应的字段。

/**
 * likes
 */
private Integer likes;

然后就可以修改数据库XMl了,这里是最简单的,直接按照原有的格式修改,只需要注意一些分割的逗号就好了,如下图所示。

8.png
9.png

到这里,新字段就创建完了,对于如何使用,代码那些增加,删除,修改,查列表的都有具体的演示。这里的要点就是,不要管代码多不多,而是要看是不是有啥很明显的规律,实际上我自己也记不住,都是看之前的代码参考着写。

添加一个新数据表

这里我就不写代码了,代码越多越让人觉得难,其实这个直接复制粘贴就好了,通过已有的代码开始改就行。我的做法是通过如下教程的代码生成器,选择指定的数据表,生成代码,再拖进项目。

Springboot半小时入门教程,代码加案例,新手摸坑大全

补充

java里判断是否相等不是==,而是如下的代码范例,这里要注意:

if(isInvite.equals(1)){
    isInvite这个字段等于1
}
if(!isInvite.equals(1)){
    isInvite这个字段不等于1
}

springboot的架构核心就是全部都封装为类,比如定义了类之后,创建类字段,然后存或者取(set是存,get是取,这里IDEA自动生成代码不需要自己记忆和手写)。

TypechoUserapi isApi = new TypechoUserapi();
isApi.setOpenId("字段值");
isApi.setAppLoginType("字段值");

最后

看完觉得代码很多记不住?我自己都记不住,都是复制粘贴,和IDEA编辑器自动弹出补全,根本就不要求记住,只需要了解一个思路和原理。

实在不行可以加群一起探讨。QQ群692117682

]]>
2 https://www.ruletree.club/archives/3360/#comments https://www.ruletree.club/feed/archives/3360/