オープンソースでシンプルかつスタイリッシュな、酷狗のサードパーティ製クライアント V1.0.0 Beta

MoeKoe Music オープンソースでシンプル、見た目も美しいKuGouのサードパーティクライアント 🌎 GitHubリポジトリ | 📦️ インストーラーをダウンロード | 💬 ブログを訪問 はじめに 10年ほど前、ウェブ版QQを使っていた頃からKuGou Musicを使い始めました(もう10年来のファンです)。なので、この数年で集めた曲はすべてそこにあります。その後、NetEase Cloud MusicやQQ Musicも試してみましたが、KuGouのプレイリストをインポートしようとしても、結果は芳しくありませんでした。私が聴くのは主に日本のアニメのOPで、多くの曲が見つかりませんでした。 結局、KuGouに戻ってきました。しかし、Mac版のKuGouは時々再生できないことがありました。インターフェースはシンプルですが、それはそれで良い点です。ネットユーザーの勧めで、今はKuGouのコンセプト版で音楽を聴いています。これは市場で数少ない、VIP曲を無料で聴ける音楽プレイヤーで、強くお勧めします。 私の自己紹介ページで、特に日本のアニメのOPを聴くのが大好きだと書きました。それをどう証明するか?(以前のウェブ版プレイリストも長年放置されていました)そうだ、自分で音楽プレイヤーを開発しよう、と。 ✨ 特徴 ✅ Vue.js ファミリーを使用して開発 🔴 KuGouアカウントでのログイン(QRコード/携帯電話/アカウントでのログイン) 📃 歌詞表示をサポート 📻 毎日のおすすめ曲 🚫🤝 ソーシャル機能一切なし 🔗 公式サーバーに直接接続、サードパーティAPIは一切使用しません ✔️ 毎日VIPを自動で受け取り、ログインするだけでVIPに 🎨 テーマカラーの切り替え 👋 起動時の挨拶メッセージ ⚙️ マルチプラットフォーム対応 🛠 さらに多くの機能を開発中 Todo List [ ] 📺 MV再生をサポート [ ] 🌚 Light/Dark Modeの自動切り替え [ ] 👆 Touch Barをサポート [ ] 🖥️ PWAをサポート、Chrome/Edgeのアドレスバー右側の ➕ をクリックしてPCにインストール可能 [ ] 🟥 Last.fm Scrobbleをサポート [ ] 🎧 Mprisをサポート [ ] ⌨️ カスタムショートカットキーとグローバルショートカットキー [ ] 🤟 多言語対応 [ ] 📻 デスクトップ歌詞 [ ] ⚙️ システムアーキテクチャの最適化 [ ] 🎶 曲、プレイリスト/お気に入り、削除 📦️ インストール 本プロジェクトの Releases ページにアクセスしてインストーラーをダウンロードしてください。 ...

2024年11月3日 · 2 分 · MoeJue

マルチプラットフォーム記事同期ブラウザ拡張機能 - ArticleSync

ArticleSync - マルチプラットフォーム記事同期プラグイン ArticleSyncは、ユーザーが複数のソーシャルプラットフォームに記事を簡単に同期・公開できるブラウザ拡張機能です。ローカルの下書きから、知乎(Zhihu)やBilibiliなどの主要プラットフォームに記事を公開することをサポートしています。これにより、異なるソーシャルメディアプラットフォーム間で記事を同期する作業が、シンプルかつ効率的になるワンストップソリューションを提供します。 ブラウザ拡張機能の仕組みに基づき、ローカルでログインしているアカウントを自動的に検出し、アカウント情報の漏洩や環境の異常といったリスクを防ぎます。 Chrome Manifest V3ブラウザ拡張機能の標準に基づいて開発されており、カーネルのバージョン要件にご注意ください。 背景 ご存知の通り、私は最近、いくつかのブログプラットフォームと多くのソーシャルサイトを新たに使い始めました。もし、それらすべてで活発に更新を続けたいと思ったらどうすればいいでしょうか。(私がまだ生きていることを証明するために)ついでに、ワンクリックで記事を転載することもできます。 私が最も頻繁に更新するのは自分の小さなサイトですが、他のプラットフォームはたまにしか更新しません。しかし、毎回手動で投稿するのは面倒です。そこで、ローカルでログインしているアカウントを自動検出し、自動で投稿してくれるプラグインが作れないかと考えました。 「自分のことは自分でやる」ということわざの通り、数日間いじくり回して、なんとか使えるものができました。残りの部分は時間があるときに更新します。お金をくれるなら話は別ですが。 このプラグインにはまだ多くの未完成な部分があり、本番環境で複数のプラットフォームでのテストも行っていません。エラーが発生するのはごく普通のことですので、その際はIssueを提出するか、自分で修正してPRを送ってください。てへぺろ〜 話の邪魔にならないように、スクリーンショットは最後に載せておきました。 それと、オープンソースは大変なので、スターを付けてくれると嬉しいです。へへへ〜 本当は、私のコミュニティプラットフォームを自動でフォローするような、個人的な機能を追加しようかとも思いました。 機能と特徴 マルチプラットフォーム対応:知乎(Zhihu)、Bilibiliなどの主要プラットフォームや、自作のオープンソースCMSシステムをサポートしています。 ステータス追跡:プラグインのインターフェースで記事の同期状況を確認できます。 アカウント管理:プラグインに連携されている各プラットフォームのアカウント情報を確認できます。 高い拡張性:開発者はアダプターパターンを通じて、簡単により多くのプラットフォームに拡張できます。 安全性と信頼性:ブラウザ拡張機能の仕組みに基づいているため、アカウントの安全性を確保し、情報漏洩などのリスクを回避します。 Todoリスト [ ] 独立した記事エディタ [ ] 画像のワンクリック同期 [x] MarkdownとHTMLの相互変換 [ ] サードパーティの画像ホスティングサービス [ ] 複数アカウント管理 [ ] マルチOSクライアントバージョン [ ] ワンクリックAI要約 [ ] 動画の同期 [ ] タグ、カテゴリのサポート [ ] より親切なエラーハンドリング [ ] より多くのプラットフォームへの対応 対応プラットフォーム メディア カテゴリ ステータス URL 対応形式 更新日時 Bilibili (哔哩哔哩) 主要セルフメディア 対応済み https://bilibili.com/ HTML 2024/10/13 知乎 (Zhihu) 主要セルフメディア 対応済み https://www.zhihu.com/ HTML 2024/10/13 博客园 (Cnblogs) ブログ 対応済み https://cnblogs.com/ HTML 2024/10/14 新浪头条 (Sina Headline) 主要セルフメディア 対応済み https://weibo.com/ HTML 2024/10/14 Emlog オープンソースCMS 対応済み https://www.emlog.net/ HTML 2024/10/14 WordPress オープンソースCMS 対応済み https://cn.wordpress.org/ HTML,Markdown 2024/10/14 Discuz! オープンソースCMS 対応済み https://www.discuz.vip/ Markdown,Text 2024/10/15 インストール手順 リポジトリをローカルにクローンします: ...

2024年10月16日 · 2 分 · MoeJue

転生:ECサイトを構築する - 萌音ECサイトV1.0リリース

萌音シリーズのN+1番目のプロジェクトが来ましたね。これも実は数年間放置していたプロジェクトで、今回ようやく完成させることができました。 まずはプロジェクトアドレス: https://MoeKoe.cn なぜ私はプロジェクトを作り続けているのか? この質問はとても面白いですね。なぜ様々なプロジェクトを、しかもお金にならないものばかり作り続けているのか。私の以前のプロジェクトに触れたことのある方はご存知でしょうが、私はどんなプロジェクトも「自分が使う」という原則に基づいて制作しています。もちろん今回も例外ではありません。ずっと、どこかのプラットフォームで、持っているけれど使わず、捨てるには惜しい小物たちを売りたいと思っていました。同時に、面白くて楽しい製品を皆さんと共有したいとも思っています(将来的には私のIP製品も加わるかもしれません)。「最高の出来事や物を、最高のあなたと共有したい」という思いもありますし、「他人が持っているなら私も持つべきだ」という原則に基づいて、私も持たなければなりません。 もし私がただ小物を売りたいだけなら、なぜ直接淘宝や闲鱼のようなプラットフォームを使わないのでしょうか。一歩譲って、これらのプラットフォームを使わないとしても、既存のECシステムを自分で構築することもできます。今や市場には成熟していて使いやすいシステムが山ほどあります。なぜわざわざ自分で開発する必要があるのでしょうか? 一言で言えば、好きだからです。これは私の趣味で、創造することが好きで、面白いものやことをするのが好きなんです。私はただ生きているだけの凡人ではなく、すごくて面白い人間になりたい。もっと多くの面白い魂と出会いたい。「すごい」という私の定義は、技術がどれほど優れているか、お金をどれほど稼ぐかということではありません。挫折や困難に直面したときでも、笑顔で立ち向かい、楽観的であり続け、初心を忘れない人。そのような人を、私は「すごい人」と呼びたいのです。 新しいプロジェクトを発表する記事なのに、またしても口語体のブログになってしまいました、ハハハ。 プロジェクト紹介 最近何をしているか?ピンクで可愛らしいもの、つまり二次元少女萌え系スタイルの魔法少女ECサイトを作っています。 魔法少女のファンタジー世界へようこそ!二次元の無限の可能性を探る冒険の旅を始めましょう!これは二次元愛好家のために特別に作られたオンラインECサイトです。ここでは、最も輝く魔法のアイテム、最もキュートな変身コスチューム、そして豊富で多様な二次元関連商品を見つけることができます。可愛い萌えグッズに夢中な方も、クールなコレクターズアイテムがお好きな方も、二次元へのすべての愛と期待をここで満たすことができます! URLをクリックすると、目が覚めるような(ピンクの)感覚を覚えるでしょう。そうです、これこそ私が求めていたスタイルです。ピンクで可愛らしく、乙女心満載で、カワイイ感じ。これこそが私の個性を際立たせるのです。 技術スタック Vue.js3 Vite Pinia Axios Node.js Express Mysql Nginx フロントエンドとバックエンドの分離 MySQLスレッドプール Vue.jsのフルスタックは本当に素晴らしいですね。ネイティブで書く手間が省けます。現在、国際化プラグイン(i18n)はこのバージョンにはまだ搭載されていません。市販のUIライブラリがこのプロジェクトの私の位置付けや個性に直接合致しないため、既存のUIライブラリは使用せず、すべて自分で手書きしました。 紹介: 仮想通貨USDTに対応(ウォレットアドレスを入力するだけで、自動で着金を監視。外部プログラム不要。監視システムは新規注文があると自動起動し、30分間新規注文がないと自動休眠し、リソース消費を削減) Alipay対面決済に対応、即時着金、自動コールバック ユーザー登録、ログイン、ログアウト、パスワード変更、アバター変更、商品レビューに対応 商品管理、商品カテゴリ管理に対応 注文管理、注文決済、注文発送、物流追跡に対応 商品注文データ分析に対応 全サイトレスポンシブデザイン フロントエンドとバックエンドの分離 MySQLスレッドプール システムの基本情報設定 最初のバージョンでは、基本的な機能と必要な機能のみを追加しました。新機能は設計段階で既に考慮されており、データベースとコードには予約がされています(そのため、あるボタンをクリックしても反応がない場合でも心配しないでください。その背後にはまだコードがないだけです)。これらは将来のバージョンで追加される予定です。現在、ECサイトでは物理的な商品の発送形式で販売していますが、将来的には仮想商品の販売も追加し、基本的に萌音発券の機能をすべて統合する予定です。 このプロジェクトの命名は「shop」ではなく「mall」としました。そのため、将来的には単なる店舗ではなく、ショッピングモールになる可能性があります。 将来: マルチテナントモード。ユーザーが直接ECサイトへの出店を申請し、萌音ECサイトを利用して自身の製品を販売できるようにする 商品の多カテゴリ分類。製品のより詳細な仕様分類 より多くの決済方法。現在、作者は他の決済権限を持っていないため、2つのみ連携済み 仮想商品に対応。発券機能を統合する形となる 商品ポスター宣伝画像生成 メールシステム。あってもなくても良い通知機能に過ぎない 右下の多機能メニュー。下部の笑顔のキャラクターがスマートナビゲーションシステムになる 商品インターフェースのデータ表示を追加。データが一目でわかるように 多言語対応(i18n)。国際化の流れに乗り、世界へ SMSシステム。メールシステムと全く同じ Redisキャッシュ。本来はこのバージョンで追加する予定だったが、データの制御は現状でも問題ない ダークモード。これもトレンドに追随 ソースコードの入手方法? 阿珏酱に233RMB以上を寄付することでソースコードを入手できます。 以前に阿珏酱を支援してくださった方々(以前の支援総額が233に満たない場合は差額を補填する形で、233を超えている場合は1元を寄付して契約を再締結するだけで直接入手できます) こちらをクリックして某コミュニティ公式交流グループで阿珏酱を支援してください。個人のQQリンクを貼れないため、グループリンクを貼りました。グループに参加してグループ管理者に@メンションしてください。 なぜ商用版を設けないのか? なぜ商用版ではなく、寄付版なのか、その違いは何でしょうか?商用版となると、ライセンスシステムが必要になり、同時にソースコードが提供されない可能性もあり、技術サポートも必要で、さらに多くの完璧な機能が求められるでしょう。商用版のお金はプロジェクト自体に支払われるもので、作者とは利害関係、つまり商業契約のモデルであり、作者はそれ(人)に対して責任を負う必要があります。(私はこの感覚が特に好きではありません。これが私が稼げない理由かもしれませんね) 一方、寄付版は、作者本人への寄付であり、個人の意思、友人同士の約束のような契約モデルであり、作者はプロジェクト自体にのみ責任を負います。 もちろん、私が言葉遊びをしている、言葉の隙間を突いていると感じるかもしれません。だから、これは完全に寄付行為なのです。今回の寄付の敷居には少し商業的な雰囲気があるかもしれませんが、それは私と妻たちが生活のために稼がなければならないからです。 ヒント 寄付版ではVueフロントエンドのソースコード+コンパイル後の静的ファイル+Node.jsバックエンドのソースファイルを提供します。 すべての寄付版で入手できるのはソースファイルであり、暗号化や難読化はされていません。漏洩しないようお願いするとともに、ご自身の権利を守るためでもあります。 ソースコードの変更にはある程度の基本的なプログラミング知識が必要です。もしできない場合は、変更しないでください。 宝塔パネルのデプロイサービスを1回提供します。 ウェブサイトのインターフェースは少女萌え系スタイルに傾倒しており、一般的な製品には適さない可能性がありますのでご注意ください。 コードは複製可能であるため、契約締結後は撤回できません。何卒ご了承ください。 今回もこれまでと同様に、寄付版の形式でソースコードを入手できるようにしました。なぜ今回またソースコードの入手を開放したのでしょうか?以前の萌音コミュニティの影響が多少あるでしょう。萌音コミュニティは私が2ヶ月以上かけて丹念に書き上げたもので、ソースコードの寄付による入手は受け付けず、純粋に自分で運営していました。寄付を申し出た人たちは皆断りましたが、最終的には一度だけ寄付を受け取りました。結局、萌音コミュニティに申し訳ない気持ちになりました。自分の手で潰してしまい、もっと多くの人にその存在を知ってもらえなかったからです。では、なぜ直接オープンソースにしないのかというと、そうするとかえってこのプロジェクトに申し訳ないと感じるからです。誰もが簡単に手に入れられるものだと思われ、その価値が失われてしまうでしょう。直接オープンソースにはしませんが、プロジェクト関連のアーキテクチャや設計思想、一部のコードを公開し、皆さんの参考にしてもらい、学習の妨げにはならないようにします。 ...

2024年10月2日 · 1 分 · MoeJue

Discuz!フォーラム 個人スペースのCSSカスタマイズ

先日、暇だったのでDiscuzフォーラムの脆弱性を探してみたところ、本当に見つかりました。ついでにツールを作成し、勢いでこの記事を書いています。 以下が事の経緯です。 この脆弱性はウェブサイトに大きな危害を与えるものではなく、個人スペースのCSSスタイルをカスタマイズできるだけで、サイトのデータに脅威を与えることはありませんので、ご安心ください。 このツールを使えば、Discuzの個人スペースのCSSスタイルをカスタマイズでき、個人スペースを豊かに美化し、単調さをなくすことができます。 テストしたDiscuzのバージョンはX3.4です。他のバージョンはご自身でテストしてください。 全球主机交流论坛(管理人さん、お許しを)でのみテストしました。同じバージョンのDiscuzであれば理論上は共通で使えるはずです。 個人スペースが開設されていないフォーラムでは使用できません。 カスタムCSSは多すぎないようにし、失敗を避けるために一行に圧縮することをお勧めします。 プロトコルヘッダーは通常、変更する必要はありません。テキストボックスを設置したのは、主に拡張性を考慮したためです。 もしlocフォーラムで操作する場合、デフォルトで阿珏ちゃんをフォローし、友達に追加します。[#手動でニヤリ + 保身のための犬アイコン] 本ソフトウェアはローカルでリクエストを送信するのみで、サーバーにデータをアップロードすることはありません。 ソフトウェアはパック(圧縮・暗号化)されているため、ウイルス対策ソフトが誤検知する可能性がありますが、安心してご使用ください Cookieの取得 ブラウザで開発者ツール(F12)を開き、対象のウェブサイトにアクセスします。ログイン状態であればどのページでも構いません。開発者ツールで「Network」タブに切り替え、ページを更新(F5)します。現在のドメインのリクエストデータを見つけてクリックし、「Headers」タブの「Request Headers」にあるcookieを探します。皆さんが私の言っていることを理解できないだろうと思ったので、特別に図を用意しました。 2つ目の方法はより簡単で迅速ですが、どのcookieが必要か分かっている場合に適しています。下の図のように操作します。 1つ目の方法で使う開発者ツールは、以前のブログ記事でも使用しましたが、cookieの取得方法については説明していませんでした。やはり1つ目の方法をお勧めします。cookieは多くても問題ありませんが、少ないと動作しません。 免責事項 本ソフトウェアは学習と交流のみを目的としています! 本ソフトウェアの作者は一切の責任を負いません! 本ソフトウェアを使用した場合、本規約に同意したものとみなします! ダウンロード 以下のダウンロードスタイルは何年も使っていませんでしたが、今日ついに復活させました。 .down_link{background:url(‘https://www.52ecy.cn/content/uploadfile/201707/md-bg.jpeg') no-repeat 100% 0% #fffdff; border: 1px solid #faf8fb; border-radius: 2px; color: #666; font-size: 14px; margin-bottom: 10px; padding: 5px 20px;}.downbtn{background: none repeat scroll 0 0 #1BA1E2; border: 0 none; border-radius: 2px; color: #FFFFFF; cursor: pointer; font-family: “Open Sans”,“Hiragino Sans GB”,“Microsoft YaHei”,“WenQuanYi Micro Hei”,Arial,Verdana,Tahoma,sans-serif; font-size: 14px; margin: -4px 20px 0 0; padding: 8px 30px;text-transform:none;text-decoration:none;} .downlink a{text-decoration:none;} .downlink a{text-decoration:none;font-size:15px;} .downlink a:link{color: #ffffff;} .downlink a:visited{color: #ffffff;} .downlink a:hover{color: #ffffff;} .downlink a:active{color: #ffffff;} .downbtn{background: none repeat scroll 0 0 #1BA1E2; border: 0 none; border-radius: 2px; color: #FFFFFF !important; cursor: pointer; font-family: “Open Sans”,“Hiragino Sans GB”,“Microsoft YaHei”,“WenQuanYi Micro Hei”,Arial,Verdana,Tahoma,sans-serif; font-size: 14px; margin: -4px 20px 0 0; padding: 8px 30px;} .yanshibtn{background: none repeat scroll 0 0 #d33431; border: 0 none; border-radius: 2px; color: #FFFFFF!important; cursor: pointer; font-family: “Open Sans”,“Hiragino Sans GB”,“Microsoft YaHei”,“WenQuanYi Micro Hei”,Arial,Verdana,Tahoma,sans-serif; font-size: 14px; margin: -4px 20px 0 0; padding: 8px 30px;text-transform:none;text-decoration:none;} .downbtn:hover,.yanshibtn:hover{background: none repeat scroll 0 0 #9B59B6; border: 0 none; border-radius: 2px; color: #FFFFFF!important; cursor: pointer; font-family: “Open Sans”,“Hiragino Sans GB”,“Microsoft YaHei”,“WenQuanYi Micro Hei”,Arial,Verdana,Tahoma,sans-serif; font-size: 14px; margin: -4px 20px 0 0; padding: 8px 30px;} .downbtn a:hover,.yanshibtn a:hover{background: none repeat scroll 0 0 #9B59B6; border: 0 none; border-radius: 2px; color: #FFFFFF; cursor: pointer; font-family: “Open Sans”,“Hiragino Sans GB”,“Microsoft YaHei”,“WenQuanYi Micro Hei”,Arial,Verdana,Tahoma,sans-serif; font-size: 14px; margin: -4px 20px 0 0; padding: 8px 30px;} ...

2020年3月24日 · 2 分 · MoeJue

ランダム二次元画像API第三弾

本来、第二弾をトップに固定していたので、第三弾を出すつもりはありませんでした。しかし、考えているうちにまたたくさんの言葉が溢れてきて、出さないのはもったいないと思い、こうして公開することにしました。 前回の更新から2年が経ち、APIも2年数ヶ月間安定して稼働しています。今回の主な更新は、チュートリアル画像1枚と、3000枚以上のランダムな二次元API画像の追加、そしてインターフェースの最適化です。だいたいこんな感じです。 すべての画像は新浪雲サーバーにホストされており、グローバルCDNアクセラレーションを備えています。幻想領域が提供するアップロードサービスに感謝します。 インターフェースアドレス: https://random.52ecy.cn/randbg.php (推奨) パラメータ パラメータ名 説明 size (オプション) 値:0~7、返される画像のサムネイル(サイズ)レベル。数字が大きいほど画像はぼやけ、画像サイズは小さくなります。デフォルトは0です。例:https://random.52ecy.cn/randbg.php?size=4 type (オプション) 値:pc、mobile、返される画像のタイプ。pcはPC版壁紙、mobileはモバイル版壁紙(縦画面)です。デフォルトはpcです。例:https://random.52ecy.cn/randbg.php?type=mobile 番外編 多くの人からAPIをオープンソースにするかどうか尋ねられましたが、必要ないと思っています。オープンソースと呼ぶことすらできません。数行のコードと2つのコマンドだけなので、公開するのは恥ずかしいくらいです。 $file_arr = file(‘data.php’); $key = array_rand($file_arr); このような書き方には効率性の問題があると言う人もいるかもしれませんが、私は、画像が数十万枚に達しておらず、ファイルサイズが数十メガバイトを超えない限り、効率性を考慮する必要はないと言います。 方法は多種多様であり、自分に合ったものが最善です。 ちなみに、最初のインターフェースは負荷に耐えきれず、無期限に停止しました。 一枚の画像がきっかけで更新することになるとは、本当に偶然ですね(強制更新)。 更新履歴 2020年3月23日 typeパラメータを更新。値:pc、mobile モバイル画像1000枚を追加 PC画像1000枚を追加

2020年3月10日 · 1 分 · MoeJue

美しすぎるAlibaba Cloud画像ホスティングツール

一度サボると気持ちいい、ずっとサボればずっと気持ちいい。うっかりまた一ヶ月も更新をサボってしまい、元旦にさえ顔を出すこともなく、お恥ずかしい限りです。 その埋め合わせとして、今日の週末にAlibaba画像アップローダーを一つ公開します。 以前のプログラムは多くの方からインストールが難しいと言われましたが、今回のAlibaba画像アップローダーは非常にシンプルです。サーバーにアップロードしてアクセスするだけで利用でき、設定は一切不要。本当にこれだけです。(決して手抜きで何も書いていないわけではありません) インターフェースをご覧ください。とても美しいでしょう? 非常にシンプルなため、今のところデモサイトはありません。もし設置が完了した方がいらっしゃれば、下部のコメント欄にご自身のアップローダーのURLを投稿して、他の方々の参考にしていただけると幸いです。 プロジェクトページ ここ数日で新しいロゴに変更しました。これもまた綺麗でしょう?(会社のPhotoshopの達人にお願いして作ってもらいました) 幻想領域画像アップローダーも認証コードを導入しました。皆さん、不適切な画像をアップロードしないようにお願いしますね。 最後に 遅くなってしまいましたが、それでも言わせてください。皆様の新しい一年が、楽しく幸せなものでありますように!

2020年1月12日 · 1 分 · MoeJue

感熱ブルートゥースプリンター開発

最近、レシート印刷の作業をしており、プロジェクトの要件としてiOSとAndroidの両方で実装する必要がありました。最初は全く分からず、インターネットで多くの資料を探し、たくさんの落とし穴にはまり、多くの記事を読みましたが、結果的にはうまくいきました。 Bluetoothプリンターは一般的に、レシート印刷とラベル印刷の2種類の印刷モードに分けられます。 会社が購入した粗悪なプリンターには開発ドキュメントすらなく、多くの落とし穴にはまる羽目になりました。開発担当者に購入時に相談してくれればよかったのに。 現在、WeChatミニプログラムでBluetoothプリンターに接続する wx.createBLEConnection は、iOSデバイスでは問題なく動作しますが、一部のAndroidスマートフォンでは異常が発生します(接続時にシステムペアリングボックスがポップアップ表示され、キャンセルをタップしても、ペアリングコードを入力して確定をタップしても、すぐに接続が切断されます。入力もキャンセルもしない場合、30秒以内にBluetoothプリンターから自動的に切断されます)。 現在採用している方法は、AndroidとiOSそれぞれにBluetooth印刷コマンドのセットを作成することです。 IOS // ====================蓝牙操作================== //初始化蓝牙模块 openBluetoothAdapter() { if (app.sysinfo.provider == 1) { // 开启蓝牙 app.onBluetooth() setTimeout(() => { this.android_search() }, 2000) return false; } this.closeBluetoothAdapter() uni.openBluetoothAdapter({ success: (res) => { console.log("初始化蓝牙模块: " + JSON.stringify(res)); this.startBluetoothDevicesDiscovery() }, fail: (res) => { if (res.errCode === 10001) { uni.onBluetoothAdapterStateChange((res) => { console.log('监听蓝牙适配器状态变化事件', res) if (res.available == false) { app.global_printing = {} this.connected = false this.chs = [] this.canWrite = false } if (res.available) { this.startBluetoothDevicesDiscovery() } }) } if (res.errCode) { app.alert('初始化蓝牙失败,错误码:' + res.errCode) return false; } app.alert(res.errMsg) } }) }, //获取本机蓝牙适配器状态 getBluetoothAdapterState() { uni.getBluetoothAdapterState({ success: (res) => { console.log('获取本机蓝牙适配器状态。', JSON.stringify(res)) if (res.discovering) { this.onBluetoothDeviceFound() } else if (res.available) { this.startBluetoothDevicesDiscovery() } }, fail: (res) => { console.log('error:获取本机蓝牙适配器状态失败', JSON.stringify(res)) setTimeout(() => { this.getBluetoothAdapterState() }, 500) } }) }, //开始搜寻附近的蓝牙外围设备 startBluetoothDevicesDiscovery() { console.log(this.discoveryStarted); if (this.discoveryStarted) { return } console.log('开始搜索蓝牙设备'); this.discoveryStarted = true this.onBluetoothDeviceFound() setTimeout(() => { uni.startBluetoothDevicesDiscovery({ allowDuplicatesKey: true, success: (res) => { console.log('startBluetoothDevicesDiscovery success', JSON.stringify( res)) }, fail: (res) => { if (res.errCode == '10001') { app.alert('当前蓝牙适配器不可用') } else { app.alert('搜索蓝牙失败,状态码:' + res.errCode) } } }) }, 500) }, // 停止搜索 stopBluetoothDevicesDiscovery() { uni.stopBluetoothDevicesDiscovery() this.discoveryStarted = false }, //寻找到新设备的事件的回调函数 onBluetoothDeviceFound() { console.log('寻找到新设备的事件的回调函数'); uni.onBluetoothDeviceFound((res) => { console.log(res); res.devices.forEach(device => { if (!device.name && !device.localName) { return } const foundDevices = this.devices const idx = this.inArray(foundDevices, 'deviceId', device.deviceId) if (idx === -1) { this.devices.push(device) } else { this.devices[idx] = device } }) }) }, //连接低功耗蓝牙设备 createBLEConnection(e) { uni.showLoading({ title: '设备连接中', mask: true }); const ds = e.currentTarget.dataset const deviceId = ds.deviceId const name = ds.name if (app.sysinfo.provider == 1) { if (ds.pair !== true) { this.android_search(deviceId) } else { console.log('已配对') } var device = null, BAdapter = null, BluetoothAdapter = null, uuid = null, main = null, bluetoothSocket = null; var mac_address = deviceId var main = plus.android.runtimeMainActivity(); BluetoothAdapter = plus.android.importClass("android.bluetooth.BluetoothAdapter"); var UUID = plus.android.importClass("java.util.UUID"); uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); BAdapter = BluetoothAdapter.getDefaultAdapter(); device = BAdapter.getRemoteDevice(mac_address); plus.android.importClass(device); bluetoothSocket = device.createInsecureRfcommSocketToServiceRecord(uuid); plus.android.importClass(bluetoothSocket); if (!bluetoothSocket.isConnected()) { console.log('检测到设备未连接,尝试连接....'); bluetoothSocket.connect(); } this.connected = true this.name = name this.deviceId = deviceId this.canWrite = true app.global_printing = { name: name, deviceId: deviceId } app.saveData1('global_printing', app.global_printing) uni.hideLoading(); return false; } uni.createBLEConnection({ deviceId, success: (res) => { this.connected = true this.name = name this.deviceId = deviceId app.global_printing = { name: name, deviceId: deviceId } this.onBLEConnectionStateChange() // 防止获取失败 setTimeout(() => { this.getBLEDeviceServices(deviceId) }, 1000) }, fail: (res) => { uni.hideLoading(); app.Toast('设备连接失败') console.log("蓝牙连接失败:", res); } }) this.stopBluetoothDevicesDiscovery() }, //获取蓝牙设备所有服务(service) getBLEDeviceServices(deviceId) { uni.getBLEDeviceServices({ deviceId, success: (res) => { console.log("获取蓝牙服务成功:" + JSON.stringify(res)) if (res.services.length == 0) { uni.hideLoading(); app.alert('没有获取到蓝牙服务,无法打印001') app.global_printing = {} return false } for (let i = 0; i < res.services.length; i++) { if (res.services[i].isPrimary) { this.getBLEDeviceCharacteristics(deviceId, res.services[i].uuid) return } } }, fail: (res) => { setTimeout(() => { this.getBLEDeviceServices(deviceId) }, 500) console.log("获取蓝牙服务失败:" + JSON.stringify(res)) } }) }, //获取蓝牙设备某个服务中所有特征值(characteristic) getBLEDeviceCharacteristics(deviceId, serviceId) { console.log('获取蓝牙设备某个服务中所有特征值', deviceId, serviceId) uni.getBLEDeviceCharacteristics({ deviceId, serviceId, success: (res) => { console.log('获取蓝牙设备某个服务中所有特征值 success', JSON.stringify(res)) uni.hideLoading(); if (res.characteristics.length == 0) { app.alert('没有获取到蓝牙服务,无法打印002') app.global_printing = {} return false } for (let i = 0; i < res.characteristics.length; i++) { let item = res.characteristics[i] if (item.properties.read) { uni.readBLECharacteristicValue({ deviceId, serviceId, characteristicId: item.uuid, }) } if (item.properties.write) { this.canWrite = true app.global_printing._deviceId = deviceId app.global_printing._serviceId = serviceId app.global_printing._characteristicId = item.uuid app.saveData1('global_printing', app.global_printing) //this.writeBLECharacteristicValue() } if (item.properties.notify || item.properties.indicate) { uni.notifyBLECharacteristicValueChange({ deviceId, serviceId, characteristicId: item.uuid, state: true, }) } } }, fail(res) { console.error('获取特征值失败:', res) } }) // 操作之前先监听,保证第一时间获取数据 uni.onBLECharacteristicValueChange((characteristic) => { console.log(this.data.chs); const idx = this.inArray(this.data.chs, 'uuid', characteristic.characteristicId) const data = {} if (idx === -1) { this.chs[this.data.chs.length] = { uuid: characteristic.characteristicId, value: ab2hex(characteristic.value) } } else { this.chs[idx] = { uuid: characteristic.characteristicId, value: ab2hex(characteristic.value) } } }) }, onBLEConnectionStateChange() { uni.onBLEConnectionStateChange((res) => { // 该方法回调中可以用于处理连接意外断开等异常情况 console.log(`蓝牙连接状态改变device ${res.deviceId} state has changed, connected: ${res.connected}`) if (res.connected == false) { app.global_printing = {} this.connected = false this.chs = [] this.canWrite = false } }) }, //断开与低功耗蓝牙设备的连接 closeBLEConnection() { app.global_printing = {} uni.closeBLEConnection({ deviceId: this.deviceId }) this.connected = false this.chs = [] this.canWrite = false }, //关闭蓝牙模块 closeBluetoothAdapter() { app.global_printing = {} uni.closeBluetoothAdapter() this.discoveryStarted = false }, //发送数据 sendStr(bufferstr, success, fail) { var that = this; uni.writeBLECharacteristicValue({ deviceId: app.global_printing._deviceId, serviceId: app.global_printing._serviceId, characteristicId: app.global_printing._characteristicId, value: bufferstr, success: function(res) { success(res); console.log('发送的数据:' + bufferstr) // console.log('message发送成功') }, fail: function(res) { fail(res) console.log("数据发送失败:" + JSON.stringify(res)) }, complete: function(res) { // console.log("发送完成:" + JSON.stringify(res)) } }) }, //遍历发送数据 printCode(arr) { var that = this; if (arr.length > 0) { this.sendStr(arr[0], function(success) { arr.shift(); that.printCode(arr); }, function(error) { app.alert('打印失败,错误码:' + error.errCode) app.printing_status = false console.log(error); }); return false; } setTimeout(function() { app.printing_status = false console.log('打印结束'); }, 1000); }, Android 比較的シンプルで便利です。Native.jsを使用してNative Javaインターフェースチャネルを直接呼び出し、plus.androidを介してAndroidネイティブシステムAPIを呼び出します。 ネイティブAndroidドキュメント https://developer.android.google.cn/reference/android/bluetooth/BluetoothAdapter?hl=en ...

2019年11月5日 · 9 分 · MoeJue

サボっていた主が、新版の三合一を持って帰ってきました。

5月20日の告白以来、ハト主は行方不明の状態が続いていました……. 何ヶ月ぶりか分かりませんが、三合一がまた更新されました。2ヶ月前にグループで立てた目標を、今日達成しました。間の2ヶ月間何をしていたかは聞かないでください-.-(大規模なハトの集会に参加するのに忙しかった) 正文 ネットワーク認識が頻繁にダウンし、非常に不安定であるというフィードバックを多くの仲間から受けていたため、今回特別にローカル認識を更新しました。 1G以上のメモリを搭載したマシンへのインストールを推奨します。推奨構成は2コア2G、最適構成は16コア32Gです [#手動顔文字] v2.0 ローカルQRコード認識と生成を追加 ネットワーク認識インターフェースを削除 既知のバグを修正 その他のいくつかの詳細な最適化 詳細な説明とインストールチュートリアルは、こちらをクリックして以前のバージョンをご覧ください。 新しいバージョンのウェブサイトはすべて古いバージョンのデータを保持しており、以前のユーザーの使用には影響せず、スポンサー版のデータとも同期されています。 スポンサー版 旧バージョンの海賊版が横行していたため、新版の三合一にはスポンサー版が追加されました。 デモサイト:https://qr.moeins.cn スポンサー版の主な特徴: QRコードの認識と生成を最適化し、認識精度を大幅に向上させ、認識速度を高速化し、CPUとメモリを占有せず、より安定しています。 21種類の三合一生成テンプレートを新規追加し、無限拡張をサポートします。追加チュートリアルは文末にあります。 外部APIインターフェースを新規追加しました。このプログラムに限定されず、どのプログラムからでも呼び出し可能です。 入手方法: こちらをクリックして18.88元以上をプロジェクトに寄付すると、決済コード三合一のスポンサー限定版を入手できます。ぜひお試しください! スポンサー版に関するいくつかの小さな説明(これまでは特に説明していませんでした) これまでのところ、私のすべてのスポンサー版プロジェクトはドメインに縛られず、暗号化されておらず、自由に拡張でき、二次開発をサポートしており、スポンサー金額も低く設定されています。そのため、スポンサーしてくださった方々は、入手したソースコードを安易に共有しないようお願いいたします。これは作者への敬意であり、ご自身の権利の保護でもあります。売買関係ではないため、重大なバグがない限り、作者は不定期に更新するか、無期限に更新を延期する場合があります。小さな問題が発生した場合、作者が空いている時間であれば指導や修正を手伝う用意がありますが、大規模な新機能の追加といった場合には、協力を拒否するか、別途料金をいただく権利があります。 スポンサー版テンプレート拡張チュートリアル テンプレートの推奨サイズは:900*1200 テンプレート画像を/public/static/images/template/テンプレートディレクトリに配置します。注意点として、中国語名を使用せず、jpg拡張子のみをサポートします。 ルートディレクトリのconfig.phpにあるqr_template項目に関連データを以下のような形式で設定します。 '001' => [ 'name' => '默认模板', 'data' => [ 150,200 ], 'title' => true, 'size' => 20 ] パラメータ説明 名称 変数名 必須 型 例 説明 テンプレートID なし はい int 001 テンプレートのファイル名。数字を推奨し、重複不可。 エイリアス name はい string デフォルトテンプレート フロントエンドに表示されるテンプレートのエイリアス X,Y data はい array [150,200] QRコード生成の左上隅の開始X(横座標)、Y(縦座標)座標。負の値は不可で、テンプレートサイズより小さいこと。 テンプレートタイトル title いいえ bool false テンプレートタイトルを有効にするかどうか。テンプレートがサポートしている場合(デフォルトテンプレートなど)に使用。空でも可。 サイズ size いいえ int 20 QRコードの生成サイズ。デフォルトは20。空でも可。 はい、とても簡単です!

2019年8月4日 · 1 分 · MoeJue

萌音クラウドノートプラットフォーム

公式サイト | 公式交流グループ | ブログ | GitHub エレガントなLaravel + 非常に使いにくいMDUI = 萌音クラウドノート。効率的なオンラインクラウドノートであり、技術文書のオンライン作成、閲覧、共有、ホスティングに特化しています。 プロジェクトの起源 ある日、某コミュニティ公式交流グループで、グループオーナーのRBQがこう言いました: クラウドノートを書いてくれない? また、ブロガーに残された時間が少ないため、多くの計画中の機能は断念されました…..残念╮(╯▽╰)╭ まあ、私は通常プロジェクトの機能を紹介するのが好きではないので、ご自身で発見してください! これは今年書いた最後のプロジェクトになるかもしれません。なぜなら、ブログのサブタイトルに書かれているように、私は夢を追いかけるからです。 今年も年初の目標を達成しました。完璧〜! インストール要件 LNMP/AMP PHP5.6.4+ OpenSSL、PDO、Mbstring、Tokenizer、XML、fileinfo Composer ダウンロード 1. このプロジェクトをクローン git clone https://github.com/178146582/note.git 2. composerで拡張パッケージをインストール composer install 3. Laravelのインストールを参照 途中の1万ステップは省略 xx. 完了 このプロジェクトにStarを付けてください〜(注意、これは特に重要です) あなたのドメインにアクセスするだけです 寄付❤ここをクリック

2018年11月6日 · 1 分 · MoeJue

萌音影视 - オンライン動画アプリ

ブログ | デモサイト | QQグループ | GitHub 洗練されたLaravelフレームワークと、全然可愛くないMeizi UIに基づいたオンライン動画アプリケーション 作者より オンライン動画サイトはどこにでも溢れていますが、それは私が自分で一つ書くことを妨げるものではありません。こうすれば、後で自分でアニメを見るのも便利になりますし、結局、自分で手を動かしてこそ豊かになれるものです。さらに新しい知識も学べるのですから、なんと素晴らしいことでしょう。 ページデザインは一部のウェブサイトを参考にしました。動画リソースはすべてインターネットからのものです。もし著作権侵害がありましたら、速やかにご連絡ください。 一緒にあのうんざりする60秒広告を捨てましょう〜 データベースなし、バックエンドモードなし、設定ファイルは一つだけ(config/web.php) 広告なし、VIP解析をサポート、公式ソース、高速、多チャンネル、多カテゴリ To-do: 独立したチャンネルホームページ テレビ局ライブ配信 複数の解析インターフェース 追加予定… スポンサー限定版 これはデュアルバージョンアプリケーションです。つまり、2つの異なるバージョンがあります。スポンサー版は通常版を最適化したもので、機能とパフォーマンスが大幅に向上し、実行速度が大幅に向上し、優先的な更新が維持されます。 さて、問題です。スポンサー限定版はどのように入手できますか? ここ または ここ でプロジェクトに58元以上を寄付することで入手できます。 もちろん、もしプロジェクトがあなたのお役に立てたなら、またはあなたが必要とするなら、私たちを支援することを選択できます。たとえわずかな金額でも、それは愛です。 オープンソースプロジェクトを書く人が利益のために書くことはないと思います。結局のところ、それはレンガ工場で一日レンガを運ぶよりも稼げないからです。 インストール要件 LNMP/AMP (PHP5.6+が必要) curl、OpenSSL拡張機能 Composer Composerによるメインプログラムのインストール 1. Composerを使用してmoeinsをインストール $ composer create-project a-jue/moeins #依存ライブラリのインストール後、インストールスクリプトが自動的に実行されます #以下のプロンプトが表示されたらインストール完了です > Illuminate\Foundation\ComposerScripts::postInstall > php artisan optimize Generating optimized class loader The compiled services file has been removed. > php artisan key:generate Application key [base64:Hx0I9UUQg7OyIz8lpDYG6Y/gW1uxS760ERdWfGG2jyQ=] set successfully. 2. ディレクトリ権限 publicサブディレクトリを公開Webディレクトリとして設定します 3. URLリライト Apacheサーバーの場合、プロジェクトディレクトリ内の.htaccessにはすでにリライトルールが設定されています。必要に応じて適宜修正してください。Nginxサーバーの場合、以下は参考となる設定です: ...

2018年9月25日 · 1 分 · MoeJue