18 changed files with 5403 additions and 0 deletions
@ -0,0 +1,6 @@ |
|||
.env |
|||
public/nginx.htaccess |
|||
public/unpackage |
|||
public/.htaccess |
|||
public/h5 |
|||
vender/ |
|||
@ -0,0 +1 @@ |
|||
|
|||
@ -0,0 +1,42 @@ |
|||
sudo: false |
|||
|
|||
language: php |
|||
|
|||
branches: |
|||
only: |
|||
- stable |
|||
|
|||
cache: |
|||
directories: |
|||
- $HOME/.composer/cache |
|||
|
|||
before_install: |
|||
- composer self-update |
|||
|
|||
install: |
|||
- composer install --no-dev --no-interaction --ignore-platform-reqs |
|||
- zip -r --exclude='*.git*' --exclude='*.zip' --exclude='*.travis.yml' ThinkPHP_Core.zip . |
|||
- composer require --update-no-dev --no-interaction "topthink/think-image:^1.0" |
|||
- composer require --update-no-dev --no-interaction "topthink/think-migration:^1.0" |
|||
- composer require --update-no-dev --no-interaction "topthink/think-captcha:^1.0" |
|||
- composer require --update-no-dev --no-interaction "topthink/think-mongo:^1.0" |
|||
- composer require --update-no-dev --no-interaction "topthink/think-worker:^1.0" |
|||
- composer require --update-no-dev --no-interaction "topthink/think-helper:^1.0" |
|||
- composer require --update-no-dev --no-interaction "topthink/think-queue:^1.0" |
|||
- composer require --update-no-dev --no-interaction "topthink/think-angular:^1.0" |
|||
- composer require --dev --update-no-dev --no-interaction "topthink/think-testing:^1.0" |
|||
- zip -r --exclude='*.git*' --exclude='*.zip' --exclude='*.travis.yml' ThinkPHP_Full.zip . |
|||
|
|||
script: |
|||
- php think unit |
|||
|
|||
deploy: |
|||
provider: releases |
|||
api_key: |
|||
secure: TSF6bnl2JYN72UQOORAJYL+CqIryP2gHVKt6grfveQ7d9rleAEoxlq6PWxbvTI4jZ5nrPpUcBUpWIJHNgVcs+bzLFtyh5THaLqm39uCgBbrW7M8rI26L8sBh/6nsdtGgdeQrO/cLu31QoTzbwuz1WfAVoCdCkOSZeXyT/CclH99qV6RYyQYqaD2wpRjrhA5O4fSsEkiPVuk0GaOogFlrQHx+C+lHnf6pa1KxEoN1A0UxxVfGX6K4y5g4WQDO5zT4bLeubkWOXK0G51XSvACDOZVIyLdjApaOFTwamPcD3S1tfvuxRWWvsCD5ljFvb2kSmx5BIBNwN80MzuBmrGIC27XLGOxyMerwKxB6DskNUO9PflKHDPI61DRq0FTy1fv70SFMSiAtUv9aJRT41NQh9iJJ0vC8dl+xcxrWIjU1GG6+l/ZcRqVx9V1VuGQsLKndGhja7SQ+X1slHl76fRq223sMOql7MFCd0vvvxVQ2V39CcFKao/LB1aPH3VhODDEyxwx6aXoTznvC/QPepgWsHOWQzKj9ftsgDbsNiyFlXL4cu8DWUty6rQy8zT2b4O8b1xjcwSUCsy+auEjBamzQkMJFNlZAIUrukL/NbUhQU37TAbwsFyz7X0E/u/VMle/nBCNAzgkMwAUjiHM6FqrKKBRWFbPrSIixjfjkCnrMEPw= |
|||
file: |
|||
- ThinkPHP_Core.zip |
|||
- ThinkPHP_Full.zip |
|||
skip_cleanup: true |
|||
on: |
|||
tags: true |
|||
@ -0,0 +1,32 @@ |
|||
|
|||
ThinkPHP遵循Apache2开源协议发布,并提供免费使用。 |
|||
版权所有Copyright © 2006-2016 by ThinkPHP (http://thinkphp.cn) |
|||
All rights reserved。 |
|||
ThinkPHP® 商标和著作权所有者为上海顶想信息科技有限公司。 |
|||
|
|||
Apache Licence是著名的非盈利开源组织Apache采用的协议。 |
|||
该协议和BSD类似,鼓励代码共享和尊重原作者的著作权, |
|||
允许代码修改,再作为开源或商业软件发布。需要满足 |
|||
的条件: |
|||
1. 需要给代码的用户一份Apache Licence ; |
|||
2. 如果你修改了代码,需要在被修改的文件中说明; |
|||
3. 在延伸的代码中(修改和有源代码衍生的代码中)需要 |
|||
带有原来代码中的协议,商标,专利声明和其他原来作者规 |
|||
定需要包含的说明; |
|||
4. 如果再发布的产品中包含一个Notice文件,则在Notice文 |
|||
件中需要带有本协议内容。你可以在Notice中增加自己的 |
|||
许可,但不可以表现为对Apache Licence构成更改。 |
|||
具体的协议参考:http://www.apache.org/licenses/LICENSE-2.0 |
|||
|
|||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS |
|||
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE |
|||
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, |
|||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
|||
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
|||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
|||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
|||
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN |
|||
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
|||
POSSIBILITY OF SUCH DAMAGE. |
|||
@ -0,0 +1,147 @@ |
|||
[简体中文](./README.md) | English |
|||
|
|||
# Instant Messaging |
|||
|
|||
### Introduce |
|||
Raingad-IM is an open source instant communication demo, which needs to be used together with the front and back ends. It is mainly used for learning and communication, and provides you with the development ideas of instant communication. Many functions need to be developed by itself, and the original intention of development is to quickly establish the internal communication system, Intranet communication and community communication. |
|||
|
|||
| type | url | |
|||
| --------- | ---- | |
|||
| Front-end source code | https://gitee.com/raingad/im-chat-front | |
|||
| Back-end source code | https://gitee.com/raingad/im-instant-chat | |
|||
| Web Demo | http://im.raingad.com/index.html | |
|||
| H5 Demo | http://im.raingad.com/h5 | |
|||
|
|||
|
|||
Dmeo account:13800000002 password:123456 |
|||
|
|||
The ending number can be modified to 2、3、4......18、19、20 |
|||
|
|||
Dmeo account:13800000020 password:123456 |
|||
|
|||
### Supported features |
|||
|
|||
-Supports single chat and group chat, and supports sending emoticons, images, voice, video, and file messages |
|||
-Single chat supports displaying the status of messages that have been read but not read, and displaying online status |
|||
-Group chat creation, deletion, group member management, group announcements, group bans, etc |
|||
-Support for top contacts and message privacy; |
|||
-Support for setting new message sound reminders and browser notifications |
|||
-Support administrator to recall group member messages |
|||
-Support group members cannot add friends to each other |
|||
-Supports one-on-one audio and video calls (connected to both web and mobile devices, not supported by mini programs) |
|||
-Supports online preview of files, images, and most media files |
|||
-Support for mobile devices (H5, APP, and mini programs, some functions are not compatible) |
|||
-New support for enterprise mode and community mode, with community mode supporting registration and adding friends functions |
|||
-The app supports online and offline push of single chat messages (requires self application for unipush service) |
|||
-Support simple backend management, including user management, group management, system settings, etc |
|||
|
|||
|
|||
### Software architecture |
|||
|
|||
Back-end technology stack:`thinkphp6+workerman+redis` |
|||
|
|||
Front-end technology stack:`vue2+Lemon-IMUI+element-UI` |
|||
|
|||
|
|||
### Installation |
|||
|
|||
> Due to the particularity of instant messaging, it is strictly prohibited to use the source code for Trojan horses, viruses, pornography, gambling, fraud and other industries in violation of local laws and regulations, as well as to engage in criminal activities, such as the use of this software for illegal activities, will be reported to the relevant departments and assist the relevant administrative law enforcement agencies to check! |
|||
|
|||
> The installation program needs to have some experience in PHP and server operation and maintenance, if not, please join the communication group to contact the author, the author provides paid deployment services! |
|||
|
|||
#### Preparatory work |
|||
You need to install the running environment first. The BAOTA server is recommended. The LNMP architecture is recommended. The following software needs to be installed: |
|||
|
|||
| environment | version | remark | Recommended | |
|||
| --------- | ---- | ---- | ---| |
|||
| linux(centOS) | >= 7.0 | The following versions were not tested | 7.9 | |
|||
| nginx | >= 1.17 | | latest | |
|||
| php | >= 7.1 | incompatible php8 | 7.3 | |
|||
| mysql | >= 5.7 | Must be 5.7 and above | 5.7 | |
|||
| redis | >= 5.0 | | 7.0 | |
|||
|
|||
**Important operation** |
|||
|
|||
1. PHP needs to install an extension : `redis` `fileinfo` |
|||
|
|||
2. PHP needs to undisable the function : `shell_exec` `chown` `exec` `putenv` `proc_open` `pcntl_exec` `pcntl_alarm` `pcntl_fork` `pcntl_waitpid` `pcntl_wait` `pcntl_signal` `pcntl_signal_dispatch` |
|||
|
|||
#### Source code download |
|||
Download the full source code and put it on your own server. Take a look at the [(releases)](https://gitee.com/raingad/im-instant-chat/releases) at the top of the gitee project home page and download the latest release in the distribution. |
|||
|
|||
#### Start installation |
|||
1. Create a website by pointing the site's running directory to the 'public' directory in the project root. |
|||
|
|||
|
|||
|
|||
2. Enable pseudo-static and set the reverse proxy, the following only shows the pseudo-static and reverse proxy configuration of nginx, Apache is not supported for the time being. |
|||
|
|||
|
|||
``` |
|||
location ~* (runtime|application)/{ |
|||
return 403; |
|||
} |
|||
location / { |
|||
if (!-e $request_filename){ |
|||
rewrite ^(.*)$ /index.php?s=$1 last; break; |
|||
} |
|||
} |
|||
|
|||
#Reverse proxy port 8282, no modification required |
|||
|
|||
location /wss |
|||
{ |
|||
proxy_pass http://127.0.0.1:8282; |
|||
proxy_http_version 1.1; |
|||
proxy_set_header Upgrade $http_upgrade; |
|||
proxy_set_header Connection "Upgrade"; |
|||
proxy_set_header X-Real-IP $remote_addr; |
|||
} |
|||
``` |
|||
|
|||
3. If you have a domain name and want to use services such as audio and video calls and voice messaging, you also need to configure a certificate to enable HTTPS. You can use a free 'Let's Encrypt' certificate. If you don't need these services, you can directly use the HTTP protocol, but the functionality will be limited. |
|||
|
|||
4. Access your IP or domain name to enter the custom installation wizard. |
|||
|
|||
|
|||
#### If installation fails |
|||
1. Enter `public\sql\database.sql` to import the database into your own database. |
|||
|
|||
2. Enter the project root directory, modify `example.env` to `.env` , and modify the corresponding database parameters. **Please carefully read the configuration instructions in env**. |
|||
|
|||
> if you want to save chat files to oss, you need to configure them in the background. Do not modify the environment configuration files after configuration. |
|||
|
|||
### Start the message push service |
|||
As the chat software requires the use of WebSocket, we need to start Workerman. The system has already built-in the corresponding service, and you can run the service from the backend management homepage ( **accessible from the bottom-left corner after logging in with an administrator account** ). If the backend service fails to start successfully, you need to perform the following debugging steps: |
|||
|
|||
**Reasons for system service startup failure**: |
|||
|
|||
1. If you have started the `php think worker:gateway start` or `php start.php start` commands in the terminal, please run `killall -9 php` in the terminal or restart the server before running again. |
|||
|
|||
2. It could be that PHP is not the default version. Execute `php -v` in the terminal to check if the version number is inconsistent with the selected PHP version when creating the website. If inconsistent, you need to modify the website's version to the default PHP version and install the corresponding dependencies and remove disabled functions for PHP. |
|||
|
|||
3. It could be due to insufficient directory permissions for execution. Reset all directory permissions to `755` for user `www` and try again. |
|||
|
|||
**If the startup fails, you can perform debugging** |
|||
|
|||
4. Enter the project root directory to run `php think worker:gateway start`, or run `php start.php start` to run the message service. Do not use `- d` during testing. Under windows, run the `start_for_ win.bat` file in the root directory directly. Since there are many restrictions on the use of Workerman under Windows, it is recommended to use Linux system in formal environment, while windows system is only recommended for development environment. |
|||
|
|||
5. The message service needs to release port 8282. If you need to modify it, please modify the corresponding parameters in the `WORKER` section of the environment configuration file. For windows users, please modify port 8282 in [`app\worker\start_gateway.php`]. The port number needs to be changed according to the situation. |
|||
|
|||
6. The system uses the domain name as the address of the websocket service directly, so it needs to configure the proxy in the nginx of the website and listen to port 8282. The parameters of the proxy configuration have been written in the pseudo-static. |
|||
|
|||
7. For more information about the use of workerman, please visit [workerman official website](https://www.workerman.net/) official website. |
|||
|
|||
8. After the deployment, the password for the administrator account is: `administrator``123456`, and the management entry is located in the lower left corner of the chat interface. |
|||
|
|||
### Install deployment Services |
|||
|
|||
The author provides the installation services of the system, including the back-end and front-end deployment to the online, to ensure the perfect operation of the project, 200 yuan per time, the installation service can provide detailed installation tutorials and interface documents, if necessary, you can contact the author! |
|||
|
|||
### QQ Communication group |
|||
If you have any questions, please leave a message or join our QQ group! |
|||
|
|||
It's not easy to create. Click a star. |
|||
|
|||
[QQ Communication group:336921267](https://jq.qq.com/?_wv=1027&k=jMQAt9lh) |
|||
|
|||
@ -0,0 +1,68 @@ |
|||
{ |
|||
"name": "topthink/think", |
|||
"description": "the new thinkphp framework", |
|||
"type": "project", |
|||
"keywords": [ |
|||
"framework", |
|||
"thinkphp", |
|||
"ORM" |
|||
], |
|||
"homepage": "http://thinkphp.cn/", |
|||
"license": "Apache-2.0", |
|||
"authors": [{ |
|||
"name": "liu21st", |
|||
"email": "liu21st@gmail.com" |
|||
}, |
|||
{ |
|||
"name": "yunwuxin", |
|||
"email": "448901948@qq.com" |
|||
} |
|||
], |
|||
"require": { |
|||
"php": ">=7.1.0", |
|||
"topthink/framework": "6.0.15", |
|||
"topthink/think-orm": "^2.0", |
|||
"jasny/sso": "^0.3.0", |
|||
"xiaodi/think-pullword": "^1.0", |
|||
"topthink/think-view": "^1.0", |
|||
"aliyuncs/oss-sdk-php": "^2.3", |
|||
"tcwei/imglazyload": "^1.3", |
|||
"tcwei/imgsrc": "^2.0", |
|||
"topthink/think-captcha": "^3.0", |
|||
"alibabacloud/client": "^1.5", |
|||
"xiaodi/think-pinyin": "^1.0", |
|||
"workerman/workerman": "^4.0", |
|||
"workerman/gateway-worker": "^3.0", |
|||
"workerman/gatewayclient": "^3.0", |
|||
"topthink/think-multi-app": "^1.0", |
|||
"thans/thinkphp-filesystem-cloud": "^1.0", |
|||
"topthink/think-queue": "^3.0", |
|||
"yunwuxin/think-cron": "^3.0", |
|||
"swiftmailer/swiftmailer": "^6.0", |
|||
"thans/tp-jwt-auth": "^1.3", |
|||
"singka/singka-sms": "^1.6", |
|||
"topthink/think-api": "^1.0" |
|||
}, |
|||
"require-dev": { |
|||
"symfony/var-dumper": "^4.2", |
|||
"topthink/think-trace": "^1.0" |
|||
}, |
|||
"autoload": { |
|||
"psr-4": { |
|||
"app\\": "app" |
|||
}, |
|||
"psr-0": { |
|||
"": "extend/" |
|||
} |
|||
}, |
|||
"config": { |
|||
"preferred-install": "dist", |
|||
"secure-http": false |
|||
}, |
|||
"scripts": { |
|||
"post-autoload-dump": [ |
|||
"@php think service:discover", |
|||
"@php think vendor:publish" |
|||
] |
|||
} |
|||
} |
|||
File diff suppressed because it is too large
@ -0,0 +1,12 @@ |
|||
2024-01-17 14:17:58:任务开始执行 |
|||
2024-01-17 14:17:58:设置已读成功 |
|||
2024-01-17 14:18:58:任务开始执行 |
|||
2024-01-17 14:18:58:设置已读成功 |
|||
2024-01-17 14:19:58:任务开始执行 |
|||
2024-01-17 14:19:58:设置已读成功 |
|||
2024-01-17 14:20:58:任务开始执行 |
|||
2024-01-17 14:20:58:设置已读成功 |
|||
2024-01-17 14:21:58:任务开始执行 |
|||
2024-01-17 14:21:58:设置已读成功 |
|||
2024-01-17 14:22:58:任务开始执行 |
|||
2024-01-17 14:22:58:设置已读成功 |
|||
@ -0,0 +1,113 @@ |
|||
APP_DEBUG = true |
|||
|
|||
[APP] |
|||
NAME = IM |
|||
LOGO = |
|||
VERSION = 5.4.0 |
|||
RELEASE = 20241226 |
|||
# 主域名必填 |
|||
HOST = |
|||
DEFAULT_TIMEZONE = Asia/Shanghai |
|||
#开放api的开关 |
|||
API_STATUS = true |
|||
#开放api接口的配置信息 |
|||
ID = a1b2c3d4e5f |
|||
SECRET = 123456sdfghjkl |
|||
|
|||
# thinkapi的令牌,目前只用于敏感词过滤,其他接口自行接入 |
|||
THINKAPI_TOKEN = |
|||
|
|||
# 下载页分发链接 |
|||
DOWNAPP_URL = |
|||
# 安卓包名,如果上架了市场,根据市场ID跳转市场 |
|||
ANDRIOD_APPID = |
|||
#安卓下载地址,如果未设置会检测根目录是否有app.apk |
|||
ANDRIOD_WEBCLIP = |
|||
#APPSTORE市场ID |
|||
IOS_APPID = |
|||
#IOS下载地址,如果没有市场的ID则使用下载地址 |
|||
IOS_WEBCLIP = |
|||
#windows下载地址 |
|||
WIN_WEBCLIP = |
|||
#mac下载地址 |
|||
MAC_WEBCLIP = |
|||
|
|||
[DATABASE] |
|||
TYPE = mysql |
|||
HOSTNAME = 127.0.0.1 |
|||
DATABASE = im |
|||
USERNAME = root |
|||
PASSWORD = My01020304 |
|||
HOSTPORT = 3306 |
|||
CHARSET = utf8mb4 |
|||
DEBUG = true |
|||
prefix = yu_ |
|||
[LANG] |
|||
default_lang = zh-cn |
|||
|
|||
[REDIS] |
|||
HOST = 127.0.0.1 |
|||
PORT = 6379 |
|||
PASSWORD = |
|||
PREFIX = |
|||
|
|||
视频封面截取配置,需要单独安装,宝塔安装默认地址为/www/server/ffmpeg/ffmpeg-6.1 |
|||
[FFMPEG] |
|||
BIN_PATH = |
|||
|
|||
[AES] |
|||
TOKEN_KEY = tHTi8USApxsdfnhTM |
|||
LOGIN_KEY = t2fe6HMnmssswDVi2 |
|||
#最后是自定义自己能记的,不要太长,不要太短,不要太简单,不要太复杂,不要太难记,一旦确定之后就不需要再修改。否者无法解析聊天记录,开启后聊天记录不可被搜索 |
|||
CHAT_KEY = |
|||
|
|||
[JWT] |
|||
SECRET = 17b190c0d612321f94f57325ae5a8b4c |
|||
TTL = 2592000 |
|||
|
|||
|
|||
[WORKER] |
|||
NAME = businessWorker |
|||
PORT = 8282 |
|||
# 根据自己的核心数而配置 |
|||
COUNT = 1 |
|||
START_PORT = 2300 |
|||
REGISTER_ADDRESS =127.0.0.1:1236 |
|||
lAN_IP = 127.0.0.1 |
|||
# 分部署部署只需要启动一个gateway,其他的gateway只需要配置register_address即可 |
|||
REGISTER_DEPLOY = true |
|||
|
|||
#配置预览功能,本系统主要使用第三方的预览工具,比如永中云转换,自带预览系统 |
|||
[PREVIEW] |
|||
# 自带预览系统URL,主要用于预览媒体文件,已内置,必须要有最后的/斜杠 |
|||
own= |
|||
# 永中云文件预览,主要用于文档预览,必须要有最后的/斜杠 |
|||
yzdcs=http://domain/ |
|||
# 永中云api code |
|||
keycode=17444844212312 |
|||
|
|||
[UNIPUSH] |
|||
# unipush的云函数转url地址,主要用于推送 |
|||
URL= |
|||
# unipush直接推送通知栏还是app接收后再创建通知栏 |
|||
IS_FORCE=false |
|||
|
|||
# 配置对象储存,主要用于聊天文件储存,可以通过后台进行配置 |
|||
|
|||
[FILESYSTEM] |
|||
driver=local |
|||
aliyun_accessId=false |
|||
aliyun_accessSecret=false |
|||
aliyun_bucket=false |
|||
aliyun_endpoint=false |
|||
aliyun_url=false |
|||
qiniu_accessKey=false |
|||
qiniu_secretKey=false |
|||
qiniu_bucket=false |
|||
qiniu_url=false |
|||
qcloud_region=false |
|||
qcloud_appId=false |
|||
qcloud_secretId=false |
|||
qcloud_secretKey=false |
|||
qcloud_bucket=false |
|||
qcloud_cdn=false |
|||
@ -0,0 +1,15 @@ |
|||
<?php |
|||
// +---------------------------------------------------------------------- |
|||
// | ThinkPHP [ WE CAN DO IT JUST THINK ] |
|||
// +---------------------------------------------------------------------- |
|||
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved. |
|||
// +---------------------------------------------------------------------- |
|||
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) |
|||
// +---------------------------------------------------------------------- |
|||
// | Author: liu21st <liu21st@gmail.com> |
|||
// +---------------------------------------------------------------------- |
|||
use think\facade\Route; |
|||
Route::get('captcha/[:config]','\\think\\captcha\\CaptchaController@index'); |
|||
Route::get('think', function () { |
|||
return 'hello,ThinkPHP6!'; |
|||
}); |
|||
@ -0,0 +1,37 @@ |
|||
<?php |
|||
/** |
|||
* run with command |
|||
* php start.php start |
|||
*/ |
|||
|
|||
ini_set('display_errors', 'on'); |
|||
use Workerman\Worker; |
|||
|
|||
if(strpos(strtolower(PHP_OS), 'win') === 0) |
|||
{ |
|||
exit("start.php not support windows, please use start_for_win.bat\n"); |
|||
} |
|||
|
|||
// 检查扩展 |
|||
if(!extension_loaded('pcntl')) |
|||
{ |
|||
exit("Please install pcntl extension. See http://doc3.workerman.net/appendices/install-extension.html\n"); |
|||
} |
|||
|
|||
if(!extension_loaded('posix')) |
|||
{ |
|||
exit("Please install posix extension. See http://doc3.workerman.net/appendices/install-extension.html\n"); |
|||
} |
|||
|
|||
// 标记是全局启动 |
|||
define('GLOBAL_START', 1); |
|||
|
|||
require_once __DIR__ . '/vendor/autoload.php'; |
|||
|
|||
// 加载所有Applications/*/start.php,以便启动所有服务 |
|||
foreach(glob(__DIR__.'/app/worker/start*.php') as $start_file) |
|||
{ |
|||
require_once $start_file; |
|||
} |
|||
// 运行所有服务 |
|||
Worker::runAll(); |
|||
@ -0,0 +1,3 @@ |
|||
CHCP 65001 |
|||
php app\worker\start_register.php app\worker\start_gateway.php app\worker\start_businessworker.php |
|||
pause |
|||
@ -0,0 +1,10 @@ |
|||
#!/usr/bin/env php |
|||
<?php |
|||
namespace think; |
|||
|
|||
// 命令行入口文件 |
|||
// 加载基础文件 |
|||
require __DIR__ . '/vendor/autoload.php'; |
|||
|
|||
// 应用初始化 |
|||
(new App())->console->run(); |
|||
@ -0,0 +1,168 @@ |
|||
<!DOCTYPE html> |
|||
<html style="font-size: 55.2px;"> |
|||
<head design-width="750"> |
|||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> |
|||
<meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"> |
|||
<meta name="apple-mobile-web-app-capable" content="yes"> |
|||
<meta name="apple-mobile-web-app-status-bar-style" content="black"> |
|||
<meta name="format-detection" content="telephone=no"> |
|||
<title>应用下载</title> |
|||
<link rel="stylesheet" href="__STATIC__/down/css/reset.css"> |
|||
<link rel="stylesheet" href="__STATIC__/down/css/style.css"> |
|||
<link rel="stylesheet" href="__STATIC__/down/css/swiper.min.css"> |
|||
<script src="__STATIC__/down/js/auto-size.js"></script> |
|||
<style>@media screen and (min-width:750px){.center{width:750px;margin-left:-375px;left:50%;}} |
|||
#app_code{ |
|||
width:210px; |
|||
margin:0 auto; |
|||
} |
|||
</style> |
|||
</head> |
|||
<body ontouchstart="" onmouseover=""> |
|||
<div class="mobile-wrap center"> |
|||
<main> |
|||
<div class="appItem"> |
|||
<div class="left"> |
|||
<img src="{$config.logo}" alt=""> |
|||
</div> |
|||
<div class="right"> |
|||
<strong>{$config.name}</strong> |
|||
<p>{$config.description}</p> |
|||
<div class="installBox"> |
|||
<a class="down" href="javascript:;">下载</a> |
|||
<a class="doubt" href="https://support.apple.com/zh-cn/102400" target='_blank'>?</a> |
|||
</div> |
|||
</div> |
|||
<div class="appTip" style="margin-bottom: 20px;"> |
|||
<div class="tipss">声明:请注意甄别APP内容,谨防上当受骗!</div> |
|||
</div> |
|||
|
|||
<div class="comment" align="center" {if condition="request()->isMobile()"} style="display: none;" {/if}> |
|||
<div id="app_code"> |
|||
|
|||
</div> |
|||
</div> |
|||
{if condition="!request()->isMobile()"} |
|||
<div class="pc-box appInfo"> |
|||
<div>桌面端下载:</div> |
|||
<div style="display: flex;justify-content: center;width:400px;margin:0 auto" align="center"> |
|||
{if condition="!empty($client.win_webclip)"} |
|||
<div class="downwin" style="margin-right:20px"> |
|||
<a class="down" href="{$client.win_webclip}" target="_blank"> |
|||
下载win版本 |
|||
</a> |
|||
</div> |
|||
{/if} |
|||
{if condition="!empty($client.mac_webclip)"} |
|||
<div class="downwin" style="margin-left:20px"> |
|||
<a class="down" href="{$client.mac_webclip}" target="_blank"> |
|||
下载MAC版本 |
|||
</a> |
|||
</div> |
|||
{/if} |
|||
{if condition="empty($client.win_webclip) && empty($client.mac_webclip)"} |
|||
暂无桌面版安装包 |
|||
{/if} |
|||
</div> |
|||
</div> |
|||
{/if} |
|||
<div class="appInfo" align="center" style="font-size: 14px;color:#999"> |
|||
V- {$Think.config.app.app_version}</p> |
|||
</div> |
|||
</div> |
|||
</main> |
|||
|
|||
</div> |
|||
</div> |
|||
<div class="pupPic"> |
|||
<img src="__STATIC__/down/img/5cbc4_5_1242_2007.png" alt=""> |
|||
</div> |
|||
</div> |
|||
<script src="__STATIC__/down/js/jquery-2.2.4.min.js"></script> |
|||
<script src="__STATIC__/down/js/swiper-4.2.0.min.js"></script> |
|||
<script src="__STATIC__/down/js/qrcode.min.js"></script> |
|||
<script> |
|||
new QRCode(document.getElementById('app_code'), { text: location.href, width: 200, height: 200 }); |
|||
|
|||
var ua = navigator.userAgent.toLowerCase(); |
|||
var Sys = {}; |
|||
var s; |
|||
(s = ua.match(/version\/([\d.]+).*safari/)) ? Sys.safari = s[1] : 0; |
|||
|
|||
|
|||
function getIOSVersion() { |
|||
var match = ua.match(/os ([\d_]+) like mac os x/i); |
|||
if (match) { |
|||
return match[1].replace(/_/g, '.'); |
|||
} |
|||
return null; |
|||
} |
|||
|
|||
|
|||
function downloadFn() { |
|||
let iosUrl='{$client.ios_webclip}'; |
|||
if(!iosUrl){ |
|||
alert('无安装包'); |
|||
} |
|||
window.location.href = iosUrl; |
|||
setTimeout(function () { |
|||
var iOSVersion = getIOSVersion(); |
|||
if (iOSVersion && parseFloat(iOSVersion) >= 17) { |
|||
alert('请手动安装-转到:设置-通用-(VPN和设备管理)配置文件-安装'); |
|||
} else { |
|||
window.location.href = "./unpackage/app.mobileprovision"; |
|||
} |
|||
}, 3500); |
|||
} |
|||
|
|||
if (/^win/.test(navigator.platform.toLowerCase())) { |
|||
$('.pc-box').show(); |
|||
} else if (/(iPhone|iPad|iPod|iOS|mac)/i.test(ua)) { |
|||
if (Sys.safari) { |
|||
$(".down").attr("href", "javascript:downloadFn();"); |
|||
|
|||
$(".doubt").click(function (event) { |
|||
$(".pup").fadeIn(); |
|||
var swiper = new Swiper('.swiper-container', { |
|||
loop: true, |
|||
pagination: { |
|||
el: '.swiper-pagination' |
|||
} |
|||
}); |
|||
}); |
|||
}else{ |
|||
$("body").click(function (event) { |
|||
$(".pupPic").show(); |
|||
}); |
|||
} |
|||
} else if (ua.indexOf('qq') > -1 && ua.indexOf('mqqbrowser') < 0) { |
|||
$(".down").attr("href", "###"); |
|||
$("body").click(function (event) { |
|||
$(".pupPic").show(); |
|||
}); |
|||
} |
|||
|
|||
else if (/(Android)/i.test(ua)) { |
|||
$(".down").attr("href", "{$client.andriod_webclip}"); |
|||
|
|||
$(".doubt").click(function (event) { |
|||
$(".pup").fadeIn(); |
|||
var swiper = new Swiper('.swiper-container', { |
|||
loop: true, |
|||
pagination: { |
|||
el: '.swiper-pagination' |
|||
} |
|||
}); |
|||
}); |
|||
} |
|||
|
|||
$(".colse").click(function (event) { |
|||
$(".pup").fadeOut(); |
|||
}); |
|||
|
|||
$(function(){ |
|||
$("#think_page_trace_open").remove(); |
|||
}) |
|||
</script> |
|||
</body> |
|||
</html> |
|||
@ -0,0 +1,648 @@ |
|||
<!DOCTYPE html> |
|||
<html lang="zh-CN"> |
|||
<head> |
|||
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"> |
|||
<meta http-equiv="Content-Language" content="zh-CN"> |
|||
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0,maximum-scale=1.0, user-scalable=no"> |
|||
<meta property="og:title" content="OZON"> |
|||
<meta property="og:image" content="./dist/images/logo-192.png"> |
|||
<meta property="og:description" content=""> |
|||
<title>OZON</title> |
|||
<link href="__STATIC__/downapp/vendors/swiper/css/swiper.min.css" rel="stylesheet"> |
|||
<link href="__STATIC__/downapp/captcha/disk/slidercaptcha.css" rel="stylesheet"> |
|||
<link href="__STATIC__/downapp/vendors/bootstrap/css/bootstrap.min.css" rel="stylesheet"/> |
|||
<link href="__STATIC__/downapp/css/app.27d0dcfa.css" rel="stylesheet"/> |
|||
<link href="__STATIC__/downapp/css/chunk-vendors.4f943ae2.css" rel="stylesheet"/> |
|||
<script src="__STATIC__/downapp/js/jquery.min.js"></script> |
|||
<script src="__STATIC__/downapp/js/jquery.cookie.js"></script> |
|||
<script src="__STATIC__/downapp/vendors/bootstrap/js/bootstrap.min.js"></script> |
|||
<script src="__STATIC__/downapp/vendors/qrcode/qrcode.min.js"></script> |
|||
<script src="__STATIC__/downapp/vendors/swiper/js/swiper.min.js"></script> |
|||
<script src="__STATIC__/downapp/captcha/disk/slidercaptcha.js"></script> |
|||
<script src="https://cdn.bootcss.com/vConsole/3.3.4/vconsole.min.js"></script> |
|||
<style> |
|||
#app{font-family:Avenir,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:#2c3e50} |
|||
.header-background{width:100%;height:175px;background-position:center top;background-size:cover;background-repeat:no-repeat} |
|||
.container{padding:0} |
|||
*,body,figure{padding:0;margin:0} |
|||
ol,ul{list-style-type:none} |
|||
.inner-image{display:block;-o-object-fit:cover;object-fit:cover;width:inherit;height:inherit} |
|||
@media screen and (min-width:320px){html{font-size:14px} |
|||
} |
|||
@media screen and (min-width:360px){html{font-size:16px} |
|||
} |
|||
@media screen and (min-width:400px){html{font-size:18px} |
|||
} |
|||
@media screen and (min-width:440px){html{font-size:20px} |
|||
} |
|||
@media screen and (min-width:480px){html{font-size:22px} |
|||
} |
|||
@media screen and (min-width:640px){html{font-size:28px} |
|||
} |
|||
.base-info{padding:1.25rem 1.45rem;margin:0 auto;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row} |
|||
.base-info .base-info-l{border-radius:.8rem;overflow:hidden;width:6.5rem;height:6.5rem;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0;border:1px solid #e0e0e0} |
|||
.base-info .base-info-l>img{width:100%;height:100%} |
|||
.base-info .base-info-r{position:relative;margin-left:1.2rem;flex:1} |
|||
.base-info .base-info-r .title{margin-top:.35rem;font-weight:700;font-size:1.25rem} |
|||
.base-info .base-info-r .category,.base-info .base-info-r .title{word-break:break-all;display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;overflow:hidden;font-size:1.5rem} |
|||
.base-info .base-info-r .category{color:#999;font-size:1rem} |
|||
.base-info .base-info-r .install-btn{display:inline-block;height:1.6rem;width:6.5rem;border-radius:.8rem;background:#0477f9;border:1px solid #0477f9;text-align:center;color:#fff;font-size:.85rem;bottom:.35rem;left:0;line-height:1.5rem} |
|||
.base-info .base-info-r .disabled-install-btn{display:inline-block;height:1.6rem;width:6.5rem;border-radius:.8rem;background:#888d94;border:1px solid #888d94;text-align:center;color:#fff;font-size:.85rem;bottom:.35rem;left:0;line-height:1.5rem} |
|||
.base-info .base-info-r .loading{height:18px;margin-right:4px;vertical-align:-3px} |
|||
.base-info .base-info-r .install-btn:hover{text-decoration:none;background-color:#338bef} |
|||
.base-info .base-info-r .clr{margin-top:1.8em} |
|||
.base-info .base-info-r .arouse{float:right;height:30px;line-height:30px;border-radius:15px;text-align:center;font-size:12px;color:#067afe} |
|||
.base-info .base-info-r .arouse b{display:inline-block;vertical-align:middle;width:20px;height:20px;line-height:20px;margin:-2px 5px 0 0;text-align:center;background:#067afe;color:#fff;border-radius:100%} |
|||
.rate-info{padding-top:1rem;margin:0 1.45rem;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;border-top:1px solid #eee} |
|||
.rate-info .rate p strong{font-size:1rem;font-weight:700;color:#888} |
|||
.rate-info .rate>img{width:5rem;margin-left:5px} |
|||
.rate-info .rate>p{color:#999;font-size:.75rem} |
|||
.rate-info .classification strong{color:#8e8f92;font-size:1rem} |
|||
.rate-info .classification>p{color:#999;font-size:.75rem} |
|||
.rate-info .rate p{padding-bottom:.25rem} |
|||
.rate-info .classification,.rate-info .rate{text-align:center} |
|||
.rate-info .classification p{padding-bottom:.25rem} |
|||
.rate-info .rate-line-between{width:1px;background-color:#e7e7e7;height:3rem;margin:.5rem .5rem 0 .5rem} |
|||
.comment-info{border-top:1px solid #eee;padding:1rem 0;margin:0 1.45rem} |
|||
.comment-info .comment-info-title{margin-bottom:.85rem;font-size:1.25rem;font-weight:bolder} |
|||
.comment-info .comment-info-content{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row} |
|||
.comment-info .comment-info-content .comment-info-l>strong{font-size:3.75rem;line-height:3.5rem;color:#4a4a4e;font-weight:700} |
|||
.comment-info .comment-info-content .comment-info-l>p{width:5.6875rem;text-align:center;color:#7b7b7b;margin-top:.625rem} |
|||
.comment-info .comment-info-content .comment-info-r{margin-left:2rem;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1} |
|||
.comment-info .comment-info-content .comment-info-r .comment-star-list>li{margin-top:.3rem;line-height:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center} |
|||
.comment-info .comment-info-content .comment-info-r .comment-star-list .comment-star{position:relative;width:2.875rem;height:.4375rem} |
|||
.comment-info .comment-info-content .comment-info-r .comment-star-list .comment-star>img{display:block;width:100%;height:100%} |
|||
.comment-info .comment-info-content .comment-info-r .comment-star-list .comment-star>div{position:absolute;left:0;top:0;height:100%;background:#fff} |
|||
.comment-info .comment-info-content .comment-info-r .comment-star-list .comment-progress{position:relative;margin-left:.5rem;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;height:.125rem;background:#e9e9ec;border-radius:.125rem} |
|||
.comment-info .comment-info-content .comment-info-r .comment-star-list .comment-progress>div{position:absolute;left:0;width:0;height:.125rem;background:#4a4a4e;border-radius:.125rem;width:90%} |
|||
.comment-message{background-color:#f9f9f9;border:none;border-radius:.5rem;margin-bottom:1rem;min-height:11.5rem} |
|||
.comment-message>div{padding:0 10px} |
|||
.comment-message .comment-user{margin-bottom:5px} |
|||
.comment-message .comment-user span:first-child{display:inline-block;width:69%;text-align:left;font-weight:700;font-size:.85rem;margin:0} |
|||
.comment-message .comment-user span:last-child{display:inline-block;width:29%;text-align:right;font-size:.75rem} |
|||
.comment-message .comment-star .glyphicon-user{font-size:.75rem;border:1px solid #dedeea;border-radius:50%;color:#fff;background-color:#e9e9ec} |
|||
.comment-message .comment-star{font-size:.75rem} |
|||
.comment-message .comment-star span:first-child{color:#ffbb15;display:inline-block;width:49%;text-align:left} |
|||
.comment-message .comment-star span:last-child{display:inline-block;width:49%;text-align:right;font-size:.75rem} |
|||
.comment-message .comment-content{padding:5px 10px} |
|||
.app-info{border-top:1px solid #eee;margin:0 1.45rem} |
|||
.app-info .app-title{margin-bottom:.5rem;font-size:1.25rem;font-weight:bolder} |
|||
.app-info .app-info-con{position:relative;font-size:.875rem} |
|||
.information-info{border-top:1px solid #eee;margin:0 1.45rem} |
|||
.information-info .app-title{margin-bottom:.5rem;font-size:1.25rem;font-weight:bolder} |
|||
.information-info .information-list{padding:0} |
|||
.information-info .information-list>li{font-size:.75rem;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center;line-height:3.5;border-bottom:1px solid #f2f2f2} |
|||
.information-info .information-list>li .l{color:#737379} |
|||
.information-info .information-list>li .r{margin-left:1.5rem;-webkit-box-flex:1;-ms-flex:1;flex:1;text-align:right;line-height:1rem} |
|||
.disclaimer{padding:10px;color:#999;background:#f9f9f9} |
|||
.pc-box{display:none;text-align:center;z-index:2;position:relative} |
|||
.pc-logo{width:160px;height:160px;border-radius:20px;overflow:hidden;margin:0 auto} |
|||
.pc-logo img{display:block;width:100%;height:100%} |
|||
.pc-box>p{font-size:20px;font-weight:400;line-height:1.5em} |
|||
.pc-box .code{margin:30px auto 10px;width:200px;height:200px} |
|||
.pc-box .info{font-size:18px;font-weight:700;margin:50px auto} |
|||
.pc-box .pc-colsed{z-index:2;position:absolute;right:20px;width:30px} |
|||
.pc-box .pc-colsed img{display:block;width:100%} |
|||
.pc-box{position:fixed;top:0;right:0;bottom:0;left:0;background-repeat:no-repeat;background-size:cover;background-image:url(dist/images/mask/bg1.jpg)} |
|||
.pc-box .tipss{font-size:14px;text-align:center;margin-top:30px;width:100%} |
|||
.app-slider{margin-top:.3rem;padding-left:1.4rem;padding-right:1.4rem;z-index:200} |
|||
.app-slider .swiper-slide{margin-right:.2rem;padding-bottom:.75em;margin:0 .25rem} |
|||
.app-slider .swiper-slide{width:calc(100% - 1rem);height:11rem} |
|||
.app-slider .swiper-slide img{display:block;height:100%;width:100%;border-radius:.8rem;-o-object-fit:cover;object-fit:cover} |
|||
.base-info .base-info-r .install-btn{display:inline-block;outline:0} |
|||
.user-verify-dialog{display:none;width:310px;background-color:#fff;border-radius:6px;position:absolute!important;top:40%;left:50%;transform:translate(-50%,-50%);z-index:110} |
|||
.user-verify-dialog>.card>.card-header{display:none;background-color:#f7f7f7;border-top-right-radius:6px;border-top-left-radius:6px} |
|||
.user-verify-dialog>.card>.card-body{height:210px} |
|||
.user-verify-dialog>.card .captcha-container{position:relative;width:100%;margin:15px!important} |
|||
.user-verify-dialog>.card>.card-header>div{padding:15px 15px 15px 18px;display:inline-block} |
|||
.user-verify-dialog>.card>.card-header>div:first-child{width:80%;text-align:left} |
|||
.user-verify-dialog>.card>.card-header>div:last-child{width:18%;text-align:right} |
|||
#hide-div{display:none;position:absolute;left:0;right:0;top:0;bottom:0;background:rgba(0,0,0,.2);z-index:100} |
|||
.sliderContainer{width:278px;margin-top:-5px} |
|||
#captcha .sliderContainer .slider{touch-action:none} |
|||
.mask-box{z-index:2;position:relative} |
|||
.mask-colsed{z-index:2;position:absolute;right:15px;top:15px;width:20px} |
|||
.mask-colsed img{display:block;width:100%} |
|||
.mask-bg{position:fixed;top:0;right:0;bottom:0;left:0;background:rgba(0,0,0,.2)} |
|||
.mask-pop{position:fixed;top:50%;left:50%;width:80%;max-width:300px;transform:translate(-50%,-50%);background:#fff;border-radius:20px;overflow:hidden;box-shadow:0 2px 4px rgba(0,0,0,.25)} |
|||
.mask-pop .swiper-container{width:100%} |
|||
.mask-pop .swiper-slide img{display:block;width:100%} |
|||
.mask-pop .swiper-slide p{margin:10px 0;text-align:center;font-size:14px;color:#0491f7} |
|||
.mask-pop .swiper-container .swiper-pagination{position:static} |
|||
.mask-pop .swiper-pagination-bullet{background:#dbf0fd;opacity:1} |
|||
.mask-pop .swiper-pagination-bullet-active{background:#0491f7} |
|||
.file-info{display:block;margin:30px 0 20px;font-size:14px;color:#00b0f9;text-align:center} |
|||
.file-box{z-index:2;position:fixed;top:50%;left:50%;padding:20px;width:70%;max-width:300px;transform:translate(-50%,-50%);background:#fff;border-radius:20px} |
|||
.file-box h3{text-align:center;font-size:16px;color:#3a3a3a} |
|||
.file-box .colsed-btn{display:block;margin:0 auto;width:80%;height:40px;line-height:40px;background:linear-gradient(90deg,#207cf9,#00cdfa);border-radius:20px;font-size:14px;color:#fff;text-align:center} |
|||
.file-con{margin:20px 0;font-size:14px;color:#777} |
|||
.file-con strong{display:block;margin-top:20px;color:#333} |
|||
.file-con p{margin-top:8px} |
|||
#gomchelp{max-height:500px;overflow-y:scroll} |
|||
.reset-route-btn.fill-color-btn{display:none;background-color:red;color:#fff;text-decoration:none;border-radius:.8rem;padding:.1rem .5rem;text-align:center} |
|||
.apk-loading{position:fixed;left:0;top:0;bottom:0;height:100%;width:100%;right:0;display:none;z-index:9999999} |
|||
.apk-loading img{width:100%;height:100%} |
|||
.click_opacity{ width:100%; height:100%; background:#000; opacity:0.6; position:fixed; z-index:10000; top:0px;} |
|||
.to_btn{ position:fixed; top:10px; right:10px; text-align:right; z-index:10001; font-family:"微软雅黑";} |
|||
.to_btn span{ display:block;} |
|||
.to_btn img{ width:20%; height:auto; display:inline-block;} |
|||
.to_btn .span1{ font-size:1.6rem; color:#fff; margin-top:5px;} |
|||
.to_btn{ color:#fff;} |
|||
.to_btn .span2{ display:inline-block; line-height:36px; width:80%; margin-bottom:12px; text-align:left; font-size:16px;} |
|||
.to_btn .span2 em{ display:inline-block; width:16px; height:16px; background:#009dd9; color:#fff; font-size:12px; text-align:center; line-height:16px; border:1px solid #fff; border-radius:50%; margin-right:3px;} |
|||
.to_btn .span2 img{ display:inline-block; width:30px; height:30px; margin:0px 5px;} |
|||
.to_btn span{ display:block; float:right;} |
|||
.to_btn .android_open img{ display:inline-block; width:150px; height:34px;} |
|||
.no_scroll{height:100%;overflow:hidden} |
|||
</style> |
|||
</head> |
|||
<body> |
|||
<div class="apk-loading"> |
|||
<img src="__STATIC__/downapp/images/apkloading.png"/> |
|||
</div> |
|||
|
|||
<div id="weixin_ios" style="display:none;"> |
|||
<div class="click_opacity"></div> |
|||
<div class="to_btn"> |
|||
<span class="span1"> |
|||
<img src="__STATIC__/downapp/images/wechat/click_btn.png"> |
|||
</span> |
|||
<span class="span2"> |
|||
<em>1</em> 点击右上角 |
|||
<img src="__STATIC__/downapp/images/wechat/menu.png"> |
|||
打开菜单 |
|||
</span> |
|||
<span class="span2"> |
|||
<em>2</em> 选择 |
|||
<img src="__STATIC__/downapp/images/wechat/safari.png"> |
|||
用Safari打开下载 |
|||
</span> |
|||
</div> |
|||
</div> |
|||
<div id="weixin_android" style="display: none;"> |
|||
<div class="click_opacity"></div> |
|||
<div class="to_btn"><span class="span1"> |
|||
<img src="__STATIC__/downapp/images/wechat/click_btn.png"> |
|||
</span> |
|||
<span class="span2"> |
|||
<em>1</em> 点击右上角 |
|||
<img src="__STATIC__/downapp/images/wechat/menu_android.png"> |
|||
打开菜单 |
|||
</span> |
|||
<span class="span2 android_open"> |
|||
<em>2</em> 选择 |
|||
<img src="__STATIC__/downapp/images/wechat/android.png"> |
|||
</span> |
|||
</div> |
|||
</div> |
|||
|
|||
<div id="container-div" class="app"> |
|||
<div class="container"> |
|||
<div class="base-info"> |
|||
<div class="base-info-l"> |
|||
<img src="__STATIC__/downapp/images/logo-192.png" alt="" class="icon"> |
|||
</div> |
|||
<div class="base-info-r"> |
|||
<div class="title"> |
|||
OZON |
|||
</div> |
|||
<div class="clr"> |
|||
<a class="arouse install-guide install-teach" style="display: none;"><b>?</b> |
|||
<span>教程</span> |
|||
</a> |
|||
<div class="state-normal"> |
|||
<a class="install-btn" id="install-btn"> |
|||
<img id="loading" src="__STATIC__/downapp/images/mask/loading.svg" style="display:none;"> |
|||
<span>免费安装</span> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
<div id="reset-route-info" data-mode="" style="font-size: 12px; padding: 0 0 0.5rem 1.45rem; display: none;"> |
|||
<span style="display: inline-block;"> |
|||
<span style="color: red;">提示:软件下载后到设置-通用-vpn与设备管理-企业级app-信任证书</span> |
|||
</span> |
|||
</div> |
|||
<div class="rate-info"> |
|||
<div class="rate" style="width: 34%;"> |
|||
<p style="margin: 0">10088个评分</p> |
|||
<p style="margin-bottom: 0"><strong>4.9 </strong></p> |
|||
<p> |
|||
<img src="__STATIC__/downapp/images/mask/stars.png" style="width: 70%;"/> |
|||
</p> |
|||
</div> |
|||
<div class="rate-line-between"></div> |
|||
<div class="classification" style="width: 24%;"> |
|||
<p style="margin: 0">年龄</p> |
|||
<p style="margin-bottom: 0"><strong>16+</strong></p> |
|||
<p>岁</p> |
|||
</div> |
|||
<div class="rate-line-between"></div> |
|||
<div class="classification" style="width: 24%;"> |
|||
<p style="margin: 0">排行榜</p> |
|||
<p style="margin-bottom: 0"><strong>#1</strong></p> |
|||
<p>应用</p> |
|||
</div> |
|||
<div class="rate-line-between"></div> |
|||
<div class="classification" style="width: 19%;"> |
|||
<p style="margin: 0">大小</p> |
|||
<p style="margin-bottom: 0"><strong>2</strong></p> |
|||
<p>M</p> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="app-slider" style="display: none;"> |
|||
<div class="swiper-container"> |
|||
<div class="swiper-wrapper"> |
|||
<div class="swiper-slide"><img src="__STATIC__/downapp/images/detail/1.jpg" alt=""></div> |
|||
<div class="swiper-slide"><img src="__STATIC__/downapp/images/detail/2.jpg" alt=""></div> |
|||
<div class="swiper-slide"><img src="__STATIC__/downapp/images/detail/3.jpg" alt=""></div> |
|||
<div class="swiper-slide"><img src="__STATIC__/downapp/images/detail/4.jpg" alt=""></div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="app-info"> |
|||
<h2 class="app-title"> |
|||
<span>简介</span> |
|||
</h2> |
|||
<div class="app-info-con open" style="height: auto;"> |
|||
<pre style="display: block; padding: 0; height: auto; overflow: auto; white-space: pre-wrap; word-wrap: break-word; background: none; border: none; font-family:'Helvetica Neue',Helvetica,Arial,sans-serif; margin: 0 0 10px; line-height: 2;">【OZON】 是一个批发采购与零售购物的跨境电商平台,源头好货厂家直购先行者,享誉全球的官方指定APP。采购进货,与工厂面对面,抢占一手低价货源;全民批发,享高性价比购物,体验一件也是批发价的生活。打开OZON,开启批发购物新模式。</pre> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="comment-info" style="padding: 0;"> |
|||
<h2 class="comment-info-title"> |
|||
<span>评分及评论</span> |
|||
</h2> |
|||
<div class="comment-info-content"> |
|||
<div class="comment-info-l"><strong>4.9</strong> |
|||
<p> |
|||
<span>满分 5 分</span> |
|||
</p> |
|||
</div> |
|||
<div class="comment-info-r"> |
|||
<ul class="comment-star-list"> |
|||
<li> |
|||
<div class="comment-star"> |
|||
<img src="__STATIC__/downapp/images/mask/stars.png"/> |
|||
</div> |
|||
<div class="comment-progress"> |
|||
<div style="width: 95%;"></div> |
|||
</div> |
|||
</li> |
|||
<li> |
|||
<div class="comment-star"> |
|||
<img src="__STATIC__/downapp/images/mask/stars.png"/> |
|||
<div style="width: 20%;"></div> |
|||
</div> |
|||
<div class="comment-progress"> |
|||
<div style="width: 10%;"></div> |
|||
</div> |
|||
</li> |
|||
<li> |
|||
<div class="comment-star"> |
|||
<img src="__STATIC__/downapp/images/mask/stars.png"/> |
|||
<div style="width: 40%;"></div> |
|||
</div> |
|||
<div class="comment-progress"> |
|||
<div style="width: 8%;"></div> |
|||
</div> |
|||
</li> |
|||
<li> |
|||
<div class="comment-star"> |
|||
<img src="__STATIC__/downapp/images/mask/stars.png"/> |
|||
<div style="width: 60%;"></div> |
|||
</div> |
|||
<div class="comment-progress"> |
|||
<div style="width: 5%;"></div> |
|||
</div> |
|||
</li> |
|||
<li> |
|||
<div class="comment-star"> |
|||
<img src="__STATIC__/downapp/images/mask/stars.png"/> |
|||
<div style="width: 80%;"></div> |
|||
</div> |
|||
<div class="comment-progress"> |
|||
<div style="width: 2%;"></div> |
|||
</div> |
|||
</li> |
|||
</ul> |
|||
<p style="text-align: right;margin-top: 5px;font-size: 0.75rem;color: #7b7b7b;"> |
|||
<span>10088个评分</span> |
|||
</p> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="comment-info comment-message"> |
|||
<div> |
|||
<p class="comment-user"> |
|||
<span>非常不错的应用,推荐!</span> |
|||
<span>04-14</span> |
|||
</p> |
|||
<div class="comment-star"> |
|||
<span> |
|||
<img src="__STATIC__/downapp/images/mask/stars-gold.jpg" style="width: 45%;"/> |
|||
</span> |
|||
<span>James Levine</span> |
|||
</div> |
|||
</div> |
|||
<div class="comment-content"> |
|||
这个应用真的太好用了,应用流畅不卡顿,画面清晰,操作便捷,玩法丰富多样,同事都在玩这个App,朋友们可以试试看,真的是非常的不错,强烈推荐推荐推荐!!! |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="app-info"> |
|||
<h2 class="app-title"> |
|||
<span>新功能</span> |
|||
</h2> |
|||
<div class="app-info-con open" style="height: auto;"> |
|||
<p> |
|||
<span>版本</span>1.0 |
|||
</p> |
|||
</div> |
|||
</div> |
|||
<div class="information-info"> |
|||
<h2 class="app-title"> |
|||
<span>信息</span> |
|||
</h2> |
|||
<ul class="information-list"> |
|||
<li> |
|||
<span class="l"><span>供应商</span></span> |
|||
<div class="r">OZON</div> |
|||
</li> |
|||
<li> |
|||
<span class="l"><span>安装包大小</span></span> |
|||
<div class="r">27M</div> |
|||
</li> |
|||
<li class="ipa-with"> |
|||
<span class="l"><span>兼容性</span></span> |
|||
<div class="r"> |
|||
<span>需要iOS 12.0 或更高版本。与iPhone、iPad和iPodtouch兼容。</span> |
|||
</div> |
|||
</li> |
|||
<li class="apk-with"><span class="l"> |
|||
<span>兼容性</span></span> |
|||
<div class="r"> |
|||
<span>需要Android6.0以上或者更高版本的安卓手机。</span> |
|||
</div> |
|||
</li> |
|||
<li> |
|||
<span class="l"><span>语言</span></span> |
|||
<div class="r"> |
|||
<span>简体中文</span> |
|||
</div> |
|||
</li> |
|||
<li> |
|||
<span class="l"><span>年龄分级</span></span> |
|||
<div class="r"> |
|||
<span>限4岁以上</span> |
|||
</div> |
|||
</li> |
|||
<li> |
|||
<span class="l"><span>价格</span></span> |
|||
<div class="r"> |
|||
<span>免费</span> |
|||
</div> |
|||
</li> |
|||
</ul> |
|||
</div> |
|||
<div class="disclaimer"> |
|||
<span></span> |
|||
<br> |
|||
<span></span> |
|||
</div> |
|||
<div style="padding: 10px;display: none;" class="device-udid"> |
|||
设备UDID:<span style="color: rgba(6,122,254,1);" |
|||
class="span-udid enable-copy" data-clipboard-target=".span-udid" |
|||
data-content=""></span> |
|||
</div> |
|||
<video id="video" style="display: none" autoplay="autoplay"></video> |
|||
</div> |
|||
</div> |
|||
<div class="mask-box step-tips" id="gosteptips" style="display: none;"> |
|||
<div class="mask-bg"></div> |
|||
<div class="mask-pop"> |
|||
<span class="mask-colsed"> |
|||
<img src="__STATIC__/downapp/images/mask/colsed.png" event-close="gosteptips" id="gosteptips-close-btn"> |
|||
</span> |
|||
<div id="step-swiper-container" class="swiper-container"> |
|||
<div class="swiper-wrapper"> |
|||
<div class="swiper-slide" style="width: 300px;"> |
|||
<img src="__STATIC__/downapp/images/mask/guide/cn/step1.jpg"> |
|||
<p>安装引导<br>第一步: 允许打开配置描述文件</p> |
|||
</div> |
|||
<div class="swiper-slide" style="width: 300px;"> |
|||
<img src="__STATIC__/downapp/images/mask/guide/cn/step2.jpg"> |
|||
<p>安装引导<br>第二步: 点击右上角安装按钮</p> |
|||
</div> |
|||
<div class="swiper-slide" style="width: 300px;"> |
|||
<img src="__STATIC__/downapp/images/mask/guide/cn/step3.jpg"> |
|||
<p>安装引导<br>第三步: 输入开机解锁密码</p> |
|||
</div> |
|||
<div class="swiper-slide" style="width: 300px;"> |
|||
<img src="__STATIC__/downapp/images/mask/guide/cn/step4.jpg"> |
|||
<p>安装引导<br>第四步: 点击下方安装按钮</p> |
|||
</div> |
|||
</div> |
|||
<div class="swiper-pagination"></div> |
|||
<a class="file-info" event-show="gomchelp" id="gomchelp-btn">什么是描述文件?</a> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div style="display: none;" class="file-box" id="gomchelp"> |
|||
<h3>描述文件</h3> |
|||
<div class="file-con"> |
|||
<strong>1,什么是描述文件?为什么要安装?</strong> |
|||
<p>描述文件是经过苹果公司认证的,用来记录用户设备,请放心使用。安装描述文件,是为了将您的设备注册到苹果用户库。是安装苹果APP的必备条件。</p> |
|||
<strong>2,安装过程中卡在了设置页面,如何解决?</strong> |
|||
<p>卡顿属于iOS系统的bug。解决方案:双击Home/底部上滑-上滑关掉设置页面-重新安装即可。</p> |
|||
<strong>3,安装描述文件时为什么要输入密码?输入什么密码?</strong> |
|||
<p>为了确认是设备主人在操作,安装描述文件时需输入【解锁密码】</p> |
|||
</div> |
|||
<div class="colsed-btn" event-close="gomchelp" id="gomchelp-close-btn">我知道了</div> |
|||
</div> |
|||
<div id="captcha" class="user-verify-dialog" data-retry="" data-retry-mode=""> |
|||
<div class="card"> |
|||
<div class="card-header"> |
|||
<div>请完成安全验证</div> |
|||
<div><i class="glyphicon glyphicon-refresh reset"></i></div> |
|||
</div> |
|||
<div class="card-body"> |
|||
<div class="captcha-container"></div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div id="hide-div"></div> |
|||
|
|||
<div id="appCode" class="user-verify-dialog" data-retry="" data-retry-mode=""> |
|||
<div class="card"> |
|||
<div class="card-header"> |
|||
<div style="text-align: left;font-size: 0.875rem;">下载码</div> |
|||
<div><i class="glyphicon glyphicon-remove close-dialog" style="color: #999;"></i></div> |
|||
</div> |
|||
<div class="card-body" style="height: auto;"> |
|||
<div class="captcha-container"> |
|||
<input type="text" class="form-control" name="code" placeholder="请输入应用下载码" |
|||
style="height: 2.5rem;width: 90%;"/> |
|||
</div> |
|||
<div style="margin: 20px;text-align: right;padding-top: 20px;"> |
|||
<button type="button" class="btn btn-primary submit-code" |
|||
style="background-color: #177DFF;">提交</button> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div id="app" style="font-size: 52px;display: none;"> |
|||
<div data-v-97c7ef6a="" class="home"> |
|||
<div class="van-overlay" style="z-index: 2003;"></div> |
|||
<div data-v-97c7ef6a="" |
|||
class="van-popup van-popup--round van-popup--bottom van-popup--safe-area-inset-bottom van-action-sheet" |
|||
style="z-index: 2004;"> |
|||
<div data-v-97c7ef6a="" class="van-action-sheet__header" style="font-size: 1rem;">重要提示<i data-v-97c7ef6a="" |
|||
onclick="closeApp()" |
|||
class="van-icon van-icon-cross van-action-sheet__close"> |
|||
<!----></i></div> |
|||
<div data-v-97c7ef6a="" class="van-action-sheet__content"> |
|||
<div data-v-97c7ef6a="" class="content"> |
|||
<div data-v-97c7ef6a="" style="padding: 0px 31.2px;"> |
|||
<div data-v-97c7ef6a="" class="title2" style="font-size: 1rem;">请耐心阅读以下说明,并按照步骤准确操作!</div> |
|||
<div data-v-97c7ef6a="" class="p1" style="font-size: 1rem;">1.点击“安装”,安装完毕后桌面将会生成“OZON”图标 |
|||
</div> |
|||
<img data-v-97c7ef6a="" src="__STATIC__/downapp/images/detail/step1-1.d7950473.png" alt="" |
|||
style="margin: 10.4px 0px;width: 100%;"> |
|||
<div data-v-97c7ef6a="" class="p1" style="font-size: 1rem;">2. 返回桌面确认“OZON”已经安装完成</div> |
|||
<div data-v-97c7ef6a="" class="downloadGroup" style="width: 100%;"> |
|||
<img data-v-97c7ef6a="" src="__STATIC__/downapp/images/detail/download1.d79f1d8e.png" |
|||
alt="" |
|||
style="width: 5rem;"> |
|||
<img data-v-97c7ef6a="" |
|||
src="data:image/png;base64,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" |
|||
alt="" |
|||
style="width: 3rem;"> |
|||
<img data-v-97c7ef6a="" src="__STATIC__/downapp/images/detail/download3.f35540ea.png" |
|||
alt="" |
|||
style="width: 5rem;"> |
|||
<img |
|||
data-v-97c7ef6a="" |
|||
src="data:image/png;base64,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" |
|||
alt="" |
|||
style="width: 3rem;"> |
|||
<img data-v-97c7ef6a="" |
|||
src="__STATIC__/downapp/images/detail/download2.7a1f965c.png" |
|||
alt="" |
|||
style="width: 5rem;"> |
|||
</div> |
|||
<div data-v-97c7ef6a="" class="p1" style="font-size: 1rem;">3. 点击“快速信任”(如果系统弹出弹框,请您点击“允许”即可 |
|||
<div id="fasttrust-div" data-v-97c7ef6a="" class="ks" |
|||
style="font-size: 1rem;width: 100%;height: 2.5rem;margin: 15.6px 0px;border-radius: 1.5rem;line-height: 2.5rem;"> |
|||
快速信任 |
|||
<img data-v-97c7ef6a="" |
|||
src="__STATIC__/downapp/images/detail/hand.804ca541.gif" |
|||
alt="" |
|||
class="hand" style="width: 6rem;"></div> |
|||
</div> |
|||
<div data-v-97c7ef6a="" class="p1" style="font-size: 1rem;">4. 找到企业级开发者证书</div> |
|||
<img data-v-97c7ef6a="" src="__STATIC__/downapp/images/detail/step2-2.662af849.png" alt="" |
|||
class="d_img" style="width: 100%;"> |
|||
<div data-v-97c7ef6a="" class="p1" style="font-size: 1rem;">5.点击该证书并且“信任”</div> |
|||
<img data-v-97c7ef6a="" src="__STATIC__/downapp/images/detail/step3-3.b8c4aeb5.png" alt="" |
|||
class="d_img" style="width: 100%;"> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="pc-box"> |
|||
<span class="pc-colsed"><img src="__STATIC__/downapp/images/mask/black_close.png" alt=""></span> |
|||
<div class="info">请使用手机扫描二维码下载</div> |
|||
<div class="pc-logo"> |
|||
<img src="__STATIC__/downapp/images/logo-192.png"> |
|||
</div> |
|||
<p>OZON</p> |
|||
<div id="app_code" class="code"></div> |
|||
<div class="tipss">声明:本平台仅提供下载托管,APP内容由开发者负责,与本平台无关</div> |
|||
</div> |
|||
</body> |
|||
</html> |
|||
<script> |
|||
var _0x4f06 = ['show', 'browser', 'KHTML', './app.mobileprovision', '#gosteptips', 'Safari', 'appmarket://details?id=', 'test', 'ios', 'html', '.pc-box', 'click', 'Trident', 'class', 'huawei', '#gomchelp', 'android', '#weixin_ios', 'mimarket://details?id=', 'oppomarket://details?packagename=', 'attr', 'match', 'safari', 'indexOf', '#install-btn', 'getElementById', 'hide', 'appVersion', '.app-slider', 'userAgent', 'QQ/', 'app_code', 'href', '#gomchelp-btn', 'oppo', 'Gecko', 'Adr', 'samsungapps://ProductDetail/', 'qq2', 'Presto', 'xiaomi', 'MQQBrowser', 'samsung', '#ipt_url']; |
|||
var _0x417a = function (_0x4f0689, _0x417a46) { |
|||
_0x4f0689 = _0x4f0689 - 0x0; |
|||
var _0x330fc9 = _0x4f06[_0x4f0689]; return _0x330fc9; |
|||
}; |
|||
var package_name = 'com.yougou.mch'; |
|||
var android_url = 'https://yougou999.oss-cn-hongkong.aliyuncs.com/yougou-mch-100002.apk'; |
|||
var ios_appid = '6449150515'; |
|||
var ios_webclip = ''; |
|||
var market = ['xiaomi', 'huawei', _0x417a('0x2a')]; |
|||
var Base = {}; |
|||
Base[_0x417a('0x1')] = function () { |
|||
var _0x4e510b = navigator[_0x417a('0x1d')], _0x41f47f = navigator[_0x417a('0x1b')]; |
|||
return { 'trident': _0x4e510b['indexOf'](_0x417a('0xc')) > -0x1, 'presto': _0x4e510b['indexOf'](_0x417a('0x27')) > -0x1, 'webKit': _0x4e510b['indexOf']('AppleWebKit') > -0x1, 'gecko': _0x4e510b['indexOf'](_0x417a('0x23')) > -0x1 && _0x4e510b[_0x417a('0x17')](_0x417a('0x2')) == -0x1, 'mobile': !!_0x4e510b['match'](/AppleWebKit.*Mobile.*/), 'ios': /(iPhone|iPad|iPod|iOS|Mac)/i[_0x417a('0x7')](_0x4e510b), 'android': _0x4e510b['indexOf']('Android') > -0x1 || _0x4e510b['indexOf'](_0x417a('0x24')) > -0x1, 'iPhone': _0x4e510b['indexOf']('iPhone') > -0x1, 'iPad': /(?:iPad|PlayBook)/['test'](_0x4e510b), 'webApp': _0x4e510b['indexOf'](_0x417a('0x5')) == -0x1, 'weixin': _0x4e510b['indexOf']('MicroMessenger') > -0x1, 'qq': _0x4e510b[_0x417a('0x15')](/QQ/i) == 'QQ', 'qq2': _0x4e510b['match'](/QQ/i) == 'QQ' && _0x4e510b['indexOf']('MQQBrowser') == -0x1, 'qq1': _0x4e510b['indexOf'](_0x417a('0x29')) > -0x1 && _0x4e510b[_0x417a('0x17')](_0x417a('0x1e')) > -0x1, 'safari': /Safari/['test'](_0x4e510b) && !(/Chrome/[_0x417a('0x7')](_0x4e510b) || /CriOS/[_0x417a('0x7')](_0x4e510b)) && _0x4e510b[_0x417a('0x17')]('MQQBrowser') < 0x0, 'xiaomi': /XiaoMi/i[_0x417a('0x7')](_0x4e510b) || / MI /i['test'](_0x4e510b), 'vivo': /ViVo/i['test'](_0x4e510b), 'oppo': /OPPO/i['test'](_0x4e510b), 'huawei': /HUAWEI/i['test'](_0x4e510b), 'samsung': /amsung/i[_0x417a('0x7')](_0x4e510b) || / SM-/['test'](_0x4e510b) }; |
|||
}(); |
|||
$(function () { |
|||
var _0x172525 = new Swiper('.swiper-container', {}); $('#gosteptips-close-btn')['on']('click', function () { |
|||
$(_0x417a('0x4'))[_0x417a('0x1a')](); |
|||
}); |
|||
$('.pc-colsed')['on'](_0x417a('0xb'), function () { $('.pc-box')[_0x417a('0x1a')](); }); |
|||
$(_0x417a('0x21'))['on'](_0x417a('0xb'), function () { $(_0x417a('0xf'))[_0x417a('0x0')](); }); |
|||
$('#gomchelp-close-btn')['on']('click', function () { $(_0x417a('0xf'))[_0x417a('0x1a')](); }); |
|||
if (!/windows phone|iphone|android/ig[_0x417a('0x7')](window['navigator']['userAgent'])) { |
|||
new QRCode(document[_0x417a('0x19')](_0x417a('0x1f')), { 'text': location['href'], 'width': 0xc8, 'height': 0xc8 }); |
|||
$(_0x417a('0xa'))['show'](); |
|||
} else if (Base['browser']['weixin'] || Base['browser'][_0x417a('0x26')]) { |
|||
if (Base['browser']['android']) { |
|||
$('#weixin_android')['show'](); |
|||
} else { |
|||
$(_0x417a('0x11'))['show'](); |
|||
} |
|||
$(_0x417a('0x9'))['attr'](_0x417a('0xd'), 'no_scroll'); |
|||
} else if (Base[_0x417a('0x1')][_0x417a('0x8')]) { |
|||
if (Base[_0x417a('0x1')][_0x417a('0x16')]) { |
|||
if (ios_appid != '') { |
|||
var _0x1687ac = 'itms-apps://itunes.apple.com/app/' + ios_appid; |
|||
$(_0x417a('0x18'))[_0x417a('0x14')](_0x417a('0x20'), _0x1687ac); |
|||
location['href'] = _0x1687ac; |
|||
} else if (ios_webclip != '') { |
|||
$(_0x417a('0x1c'))['show'](); |
|||
$('#install-btn')['attr']('href', './' + ios_webclip); |
|||
$(_0x417a('0x18'))[_0x417a('0xb')](function (_0x526b35) { |
|||
setTimeout(function () { |
|||
if (confirm) { |
|||
location['href'] = _0x417a('0x3'); |
|||
} |
|||
}, 0xdac); |
|||
$('#gosteptips')[_0x417a('0x0')](); |
|||
}); |
|||
} |
|||
} else { |
|||
$('body')[_0x417a('0xb')](function (_0x180351) { |
|||
$(_0x417a('0x2b'))['html'](location['href']); |
|||
$('.wechat-mask')['show'](); |
|||
}); |
|||
} |
|||
} else if (Base['browser'][_0x417a('0x10')]) { |
|||
var _0x1687ac = android_url; |
|||
if (market[_0x417a('0x17')](_0x417a('0x28')) > -0x1 && Base['browser']['xiaomi']) { |
|||
_0x1687ac = _0x417a('0x12') + package_name; |
|||
} else if (market[_0x417a('0x17')]('vivo') > -0x1 && Base[_0x417a('0x1')]['vivo']) { |
|||
_0x1687ac = 'vivomarket://details?id=' + package_name; |
|||
} else if (market[_0x417a('0x17')](_0x417a('0x22')) > -0x1 && Base[_0x417a('0x1')][_0x417a('0x22')]) { |
|||
_0x1687ac = _0x417a('0x13') + package_name; |
|||
} else if (market[_0x417a('0x17')](_0x417a('0xe')) > -0x1 && Base[_0x417a('0x1')]['huawei']) { |
|||
_0x1687ac = _0x417a('0x6') + package_name; |
|||
} else if (market['indexOf'](_0x417a('0x2a')) > -0x1 && Base[_0x417a('0x1')][_0x417a('0x2a')]) { |
|||
_0x1687ac = _0x417a('0x25') + package_name; |
|||
} |
|||
$('#install-btn')[_0x417a('0x14')]('href', _0x1687ac); |
|||
if (_0x1687ac != android_url) { |
|||
location['href'] = _0x1687ac; |
|||
} |
|||
} |
|||
}); |
|||
</script> |
|||
@ -0,0 +1,52 @@ |
|||
<!DOCTYPE html> |
|||
<html lang="en"> |
|||
|
|||
<head> |
|||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> |
|||
<title>文件编辑</title> |
|||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> |
|||
<meta name="keywords" content="" /> |
|||
<meta name="description" content="" /> |
|||
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0,viewport-fit=cover" /> |
|||
<meta name="format-detection" content="telephone=no" /> |
|||
<!-- <script type="text/javascript" src="http://39.106.36.245:5433/web-apps/apps/api/documents/api.js"></script> --> |
|||
<script type="text/javascript" src="https://onlyoffice.lcoce.com/web-apps/apps/api/documents/api.js"></script> |
|||
<style> |
|||
body { |
|||
margin: 0; |
|||
padding: 0; |
|||
} |
|||
|
|||
.onlyofficeBox { |
|||
height: 100%; |
|||
padding: 0; |
|||
position: absolute; |
|||
width: 100%; |
|||
} |
|||
</style> |
|||
</head> |
|||
|
|||
|
|||
<body> |
|||
<div class='onlyofficeBox'> |
|||
<div id="placeholder"></div> |
|||
</div> |
|||
|
|||
</body> |
|||
<script> |
|||
new DocsAPI.DocEditor("placeholder", { |
|||
"document": { |
|||
"fileType": "docx", |
|||
"key": "Khirz6zTPdfd71232123asdasd", |
|||
"title": "法律顾问流程.docx", |
|||
"url": "https://document.lcoce.com/disk_VAO34jXqWoQ2/folder_2G9r4xOGavwy/5f8502435b650.docx" |
|||
}, |
|||
"documentType": "word", |
|||
'editorConfig': { |
|||
'lang': 'zh-CN' |
|||
}, |
|||
'lang': 'zh-CN' |
|||
}); |
|||
</script> |
|||
|
|||
</html> |
|||
@ -0,0 +1,47 @@ |
|||
<!DOCTYPE html> |
|||
<html lang="zh"> |
|||
|
|||
<head> |
|||
<meta charset="UTF-8"> |
|||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> |
|||
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|||
<title>文件预览系统</title> |
|||
<!-- css --> |
|||
<link rel="stylesheet" href="__STATIC__/common/css/main.css"> |
|||
<link rel="stylesheet" href="__STATIC__/common/css/audio.css"> |
|||
<link rel="stylesheet" href="__STATIC__/luckysheet/css/pluginsCss.css"> |
|||
<link rel="stylesheet" href="__STATIC__/luckysheet/css/plugins.css"> |
|||
<link rel="stylesheet" href="__STATIC__/luckysheet/css/luckysheet.css"> |
|||
<link rel="stylesheet" href="__STATIC__/luckysheet/css/iconfont.css"> |
|||
<link rel="stylesheet" href="__STATIC__/pptxjs/css/pptxjs.css"> |
|||
<link rel="stylesheet" href="__STATIC__/pptxjs/css/nv.d3.min.css"> |
|||
<link rel="stylesheet" href="static/viewer/viewer.css"> |
|||
</head> |
|||
|
|||
<body style="background-color: #0000005c;"> |
|||
<div id="container"> |
|||
|
|||
</div> |
|||
|
|||
<!-- js --> |
|||
<script type="text/javascript" src="__STATIC__/jquery-2.0.3.min.js"></script> |
|||
<script type="text/javascript" src="__STATIC__/jPreview.js"></script> |
|||
<script> |
|||
jPreview.preview({ |
|||
container:"container", // 容器id |
|||
staticPath:"__STATIC__/", // 静态资源路径 |
|||
url:"{$url}", // 预览资源路径,没有的话获取url中scr参数 |
|||
ext:"{$ext}", // 资源后缀,如果url中没有的话,必须传入后缀名,否则无法识别文件类型 |
|||
name:"{$name}", // 资源名称 |
|||
watermarkTxt:"", // 水印文字 |
|||
watermarkSize:"", // 水印文字大小 |
|||
priority:1, // 优先级 1:使用插件预览 2:使用office在线预览, |
|||
oburl:"", // 可自动设置在线设置office线上预览地址,不需要的话可以不传 |
|||
}); |
|||
$(function(){ |
|||
$("#think_page_trace_open").remove(); |
|||
}) |
|||
</script> |
|||
</body> |
|||
|
|||
</html> |
|||
@ -0,0 +1,454 @@ |
|||
<!DOCTYPE html> |
|||
<html lang="zh-CN"> |
|||
|
|||
<head> |
|||
<meta charset="UTF-8"> |
|||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> |
|||
<title>{$Think.config.app.app_name}简易安装向导</title> |
|||
<link rel="stylesheet" href="__STATIC__/elementui/element-ui.css"> |
|||
<script src="__STATIC__/js/vue.js"></script> |
|||
<script src="__STATIC__/js/jquery-2.0.3.min.js"></script> |
|||
<script src="__STATIC__/elementui/element-ui.js"></script> |
|||
</head> |
|||
|
|||
<body> |
|||
<div id="el-app"> |
|||
<el-card class="box-card header-card" style="margin-bottom: 20px;"> |
|||
<header class="header" align="center"> |
|||
<div class="header-content"> |
|||
<div class="header-logo"> |
|||
<el-avatar src="{$Think.config.app.app_logo}" :size="50"> |
|||
</el-avatar> |
|||
</div> |
|||
<div class="contact-us" align="left"> |
|||
<div><a class="main-color" href="http://im.raingad.com/index.html"> {$Think.config.app.app_name} </a>for {$Think.config.app.app_verison} 安装向导</div> |
|||
<div>QQ交流群: <a href="https://jq.qq.com/?_wv=1027&k=jMQAt9lh" target="_blank">336921267</a></div> |
|||
</div> |
|||
</div> |
|||
</header> |
|||
</el-card> |
|||
|
|||
<el-card class="container box-card" style="padding:0"> |
|||
<el-steps :active="action" simple finish-status="success"> |
|||
<el-step title="IM介绍"> </el-step> |
|||
<el-step title="环境检测"> </el-step> |
|||
<el-step title="连接数据库"> </el-step> |
|||
<el-step title="安装完成"> </el-step> |
|||
</el-steps> |
|||
<div class="step-item" v-if="action==0"> |
|||
<div class="setting-version"> |
|||
<b> 免责申明:</b> |
|||
<p><span class="main-color"> {$Think.config.app.app_name} </span>是由个人开发者《<a href="https://gitee.com/lvzhe-lcoce" target="_blank">raingad@foxmail.com</a>》开发,以下简称“本软件”,用户出于自愿而使用本软件,必须了解使用本软件的风险,本软件只用作学习交流使用,我们不承诺对免费用户提供任何形式的技术支持,将并且不能作为商业用途使用,若因为使用本软件产生的侵权行为一律与作者无关。严禁将源码用于木马、病毒、色情、赌博、诈骗等违反国家法律法规行业,如发现有使用本软件进行非法活动,将向有关部门举报和协助相关行政执法机关清查! |
|||
<p>如果本软件有侵权行为,请联系作者删除!</p> |
|||
|
|||
</p> |
|||
<b> 软件地址:</b> |
|||
<p>前端地址:<a href="https://gitee.com/raingad/im-chat-front" target="_blank">https://gitee.com/raingad/im-chat-front</a></p> |
|||
<p>后端地址:<a href="https://gitee.com/raingad/im-instant-chat" target="_blank">https://gitee.com/raingad/im-instant-chat</a></p> |
|||
|
|||
<b> 支持功能:</b> |
|||
<ul> |
|||
<li v-for="item in funcList">${item.text}</li> |
|||
</ul> |
|||
|
|||
</div> |
|||
<div class="setting-version" style="color: #a6a6a6"> |
|||
<p>后端技术栈:thinkphp6+workerman+redis</p> |
|||
<p>前端技术栈:vue+Lemon-IMUI+element-UI</p> |
|||
</div> |
|||
</div> |
|||
<div class="step-item" v-if="action==1"> |
|||
<h4>环境状态</h4> |
|||
<el-table :data="env" border style="width: 100%" size="mini"> |
|||
<el-table-column prop="name" label="检查项" align="center"> |
|||
</el-table-column> |
|||
<el-table-column prop="description" label="建议要求" width="300px" align="center"> |
|||
</el-table-column> |
|||
<el-table-column prop="value" label="当前环境" align="center"> |
|||
</el-table-column> |
|||
<el-table-column prop="status" label="是否通过" align="center"> |
|||
<template slot-scope="scope"> |
|||
<span :class="scope.row.status === 'ok' ? 'fc-success' : 'fc-danger'">${scope.row.status}</span> |
|||
</template> |
|||
</el-table-column> |
|||
|
|||
</el-table> |
|||
<h4>文件夹权限</h4> |
|||
<el-table :data="dir" border style="width: 100%" size="mini"> |
|||
<el-table-column prop="dir" label="目录检查项" width="300px" align="center"> |
|||
</el-table-column> |
|||
<el-table-column prop="value" label="当前环境" align="center"> |
|||
</el-table-column> |
|||
<el-table-column prop="status" label="是否通过" align="center"> |
|||
<template slot-scope="scope"> |
|||
<span :class="scope.row.status === 'ok' ? 'fc-success' : 'fc-danger'">${scope.row.status}</span> |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
<div align="center" style="margin-top:15px;"> |
|||
<el-button round @click="reCheckEnv" :loading="loading">重新检测</el-button> |
|||
</div> |
|||
|
|||
</div> |
|||
<div class="step-item" v-if="action==2" align="center"> |
|||
<div class="step-form"> |
|||
<el-alert |
|||
title="如果未设置成功,请将根目录下[example.env]更名为为[.env],并填写好相关参数" |
|||
type="warning"> |
|||
</el-alert> |
|||
<h4>请填写数据库信息</h4> |
|||
<el-form ref="form" :model="form" label-width="120px"> |
|||
<el-form-item label="服务器地址"> |
|||
<el-input v-model="form.hostname"> |
|||
<template slot="append">数据库地址一般为:127.0.0.1</template> |
|||
</el-input> |
|||
|
|||
</el-form-item> |
|||
<el-form-item label="数据库"> |
|||
<el-input v-model="form.database"></el-input> |
|||
</el-form-item> |
|||
<el-form-item label="表前缀"> |
|||
<el-input v-model="form.prefix"> |
|||
<template slot="append">默认为yu_</template> |
|||
</el-input> |
|||
</el-form-item> |
|||
<el-form-item label="数据库用户名"> |
|||
<el-input v-model="form.username"> |
|||
<template slot="append">生产环境建议创建独立账户</template> |
|||
</el-input> |
|||
</el-form-item> |
|||
<el-form-item label="数据库密码"> |
|||
<el-input v-model="form.password"></el-input> |
|||
</el-form-item> |
|||
<el-form-item label="端口"> |
|||
<el-input v-model="form.hostport"> |
|||
<template slot="append">数据库端口一般为:3306</template> |
|||
</el-input> |
|||
</el-form-item> |
|||
<h4>redis配置</h4> |
|||
<el-form-item label="服务器地址"> |
|||
<el-input v-model="form.redishost"> |
|||
<template slot="append">默认为127.0.0.1</template> |
|||
</el-input> |
|||
</el-form-item> |
|||
<el-form-item label="端口"> |
|||
<el-input v-model="form.redisport"> |
|||
<template slot="append">默认为6379</template> |
|||
</el-input> |
|||
</el-form-item> |
|||
<el-form-item label="密码"> |
|||
<el-input v-model="form.redispass"> |
|||
<template slot="append">可以为空</template> |
|||
</el-input> |
|||
</el-form-item> |
|||
</el-form> |
|||
|
|||
</div> |
|||
|
|||
</div> |
|||
<div class="step-item" v-if="action==3"> |
|||
<p>开始安装...</p> |
|||
<div id='install-process'> |
|||
</div> |
|||
|
|||
</div> |
|||
<div class="step-item" v-if="action==4"> |
|||
<div class="setting-version"> |
|||
<p>您已成功安装本程序,现在您还需最后一步即可使用聊天程序!</p> |
|||
<p>管理员账号:<b style="font-size:18px">administrator</b>;密码:<b style="font-size:18px">123456</b>;进入后再聊天界面的左下角可以进入后台。</p> |
|||
<h4>启动消息推送</h4> |
|||
<p>第一种方式:进入终端,输入[ <code>php think worker:gateway start -d</code> ] 或者 [ <code>php start.php start -d</code> ] 即可启动服务</p> |
|||
<p>第二种方式:linux上可以直接在后台启动服务,首次启动必须要先进行第一种方式调试没问题后才能用这种方式</p> |
|||
<p>windows启动直接运行根目录的start_for_win.bat,推送服务不建议在windows上运行,不稳定,生产环境请使用linux。</p> |
|||
<p>PS:消息推送的服务器必须开启8282端口,并在nginx配置文件中配置反向代理。如需更改,请修改[ <b>app\worker\start_gateway.php</b> ]中的8282端口</p> |
|||
<h4>前台地址:</h4> |
|||
<p>浏览器访问:<a href="{:getMainHost()}/index.html">{:getMainHost()}/index.html</a></p> |
|||
<div>QQ交流群: <a href="https://jq.qq.com/?_wv=1027&k=jMQAt9lh" target="_blank">336921267</a></div> |
|||
</div> |
|||
</div> |
|||
<hr style="border: 1px solid #f5f5f5;"> |
|||
<div class="next-button" align="center" v-if="!isDone"> |
|||
<el-button @click="pre" :disabled="preDisabled" v-text="preText"></el-button> |
|||
<el-button type="primary" @click="next" :disabled="nextDisabled" v-text="nextText"></el-button> |
|||
</div> |
|||
<div class="next-button" align="center" v-if="isDone"> |
|||
<el-button type="success" @click="openSys" v-text="doneText"> </el-button> |
|||
</div> |
|||
|
|||
</el-card> |
|||
|
|||
<div class="footer-wrapper" align="center"> |
|||
<footer class="footer"> |
|||
©{:date("Y")} {$Think.config.app.app_name} for {$Think.config.app.app_version} |
|||
</footer> |
|||
</div> |
|||
</div> |
|||
|
|||
</body> |
|||
<script> |
|||
var app = new Vue({ |
|||
delimiters: ['${', '}'], |
|||
el: '#el-app', |
|||
data() { |
|||
return { |
|||
action: 0, |
|||
preDisabled: true, |
|||
nextDisabled: false, |
|||
preText: "上一步", |
|||
nextText: "下一步", |
|||
isDone: false, |
|||
doneText: '进入系统', |
|||
env: [], |
|||
dir: [], |
|||
database: [], |
|||
status: 1, |
|||
loading: false, |
|||
form: { |
|||
hostname: '127.0.0.1', |
|||
database: 'im', |
|||
username: 'root', |
|||
password: '', |
|||
hostport: 3306, |
|||
prefix: 'yu_', |
|||
redishost: '127.0.0.1', |
|||
redisport: '6379', |
|||
redispass: '', |
|||
}, |
|||
funcList:[ |
|||
{ |
|||
icon:'el-icon-chat-line-round', |
|||
text:'支持单聊和群聊,支持发送表情、图片、语音、视频和文件消息', |
|||
}, |
|||
{ |
|||
icon:'el-icon-potato-strips', |
|||
text:'单聊支持消息已读未读的状态显示,在线状态显示', |
|||
}, |
|||
{ |
|||
icon:'el-icon-user', |
|||
text:'群聊创建、删除和群成员管理、群公告、群禁言、@群成员等', |
|||
}, |
|||
{ |
|||
icon:'el-icon-ice-cream-round', |
|||
text:'支持置顶联系人,消息免打扰;支持设置新消息声音提醒,浏览器通知', |
|||
}, |
|||
{ |
|||
icon:'el-icon-video-camera', |
|||
text:'支持一对一音视频通话(和移动端不互通)', |
|||
}, |
|||
{ |
|||
icon:'el-icon-milk-tea', |
|||
text:'支持文件、图片和绝大部分媒体文件在线预览', |
|||
}, |
|||
{ |
|||
icon:'el-icon-mobile-phone', |
|||
text:'支持移动端(H5和APP),支持简易后台管理', |
|||
} |
|||
|
|||
] |
|||
} |
|||
}, |
|||
watch: { |
|||
action(val) { |
|||
this.status = 1; |
|||
if (val == 0) { |
|||
this.preDisabled = true; |
|||
} else { |
|||
this.preDisabled = false; |
|||
} |
|||
if (val == 1) { |
|||
this.getEnv(); |
|||
} |
|||
if (val == 3) { |
|||
this.process('正在写入数据库...'); |
|||
var _this = this; |
|||
setTimeout(function() { |
|||
_this.install() |
|||
}, 1000); |
|||
} else { |
|||
$('#install-process').html(''); |
|||
} |
|||
if (val == 4) { |
|||
this.isDone = true; |
|||
} |
|||
}, |
|||
status(val) { |
|||
if (val == 0) { |
|||
this.nextDisabled = true; |
|||
} else { |
|||
this.nextDisabled = false; |
|||
} |
|||
} |
|||
}, |
|||
methods: { |
|||
next() { |
|||
if (this.action == 2) { |
|||
this.checkDatabase(); |
|||
} else if (this.action < 4) { |
|||
this.action++; |
|||
} |
|||
}, |
|||
pre() { |
|||
if (this.action > 0) { |
|||
this.action--; |
|||
} |
|||
}, |
|||
openSys() { |
|||
window.location.href = "{:getMainHost()}/index.html"; |
|||
}, |
|||
getEnv() { |
|||
var _this = this; |
|||
$.post("{:url('install/getEnv')}", {}, function(res) { |
|||
if (res.code == 0) { |
|||
_this.env = res.data.env; |
|||
_this.dir = res.data.dir; |
|||
_this.status = res.data.status; |
|||
} |
|||
_this.loading = false; |
|||
}) |
|||
}, |
|||
checkDatabase() { |
|||
var _this = this; |
|||
$.post("{:url('install/checkDatabase')}", { |
|||
form: this.form |
|||
}, function(res) { |
|||
if (res.code == 0) { |
|||
_this.status = res.data.status; |
|||
_this.action++; |
|||
} else { |
|||
_this.$message.error(res.msg); |
|||
} |
|||
_this.loading = false; |
|||
}) |
|||
}, |
|||
install() { |
|||
this.status = 0; |
|||
var _this = this; |
|||
$.post("{:url('install/install')}", {}, function(res) { |
|||
if (res.code == 0) { |
|||
setTimeout(function() { |
|||
_this.process('数据库写入成功,执行sql语句 ' + 1 + ' 条!'); |
|||
setTimeout(function() { |
|||
_this.process('正在跳转...'); |
|||
setTimeout(function() { |
|||
_this.action++; |
|||
}, 1000); |
|||
}, 1000); |
|||
}, 1000); |
|||
_this.status = res.data.status; |
|||
} else { |
|||
setTimeout(_this.process("<span class='fc-danger'>" + res.msg + "</span>"), 1000); |
|||
_this.isDone = true; |
|||
} |
|||
_this.loading = false; |
|||
}) |
|||
}, |
|||
reCheckEnv() { |
|||
this.loading = true; |
|||
this.getEnv(); |
|||
}, |
|||
process(text) { |
|||
var html = "<p>" + text + "</p>"; |
|||
this.$nextTick(() => { |
|||
$('#install-process').append(html); |
|||
}); |
|||
|
|||
} |
|||
|
|||
} |
|||
}) |
|||
</script> |
|||
<style> |
|||
body { |
|||
background-color: #f5f5f5; |
|||
margin: 0; |
|||
padding: 0 |
|||
} |
|||
|
|||
.header-card { |
|||
margin-bottom: 15px; |
|||
} |
|||
|
|||
.header-card .el-card__body { |
|||
padding: 10px; |
|||
} |
|||
|
|||
.header-content { |
|||
display: flex; |
|||
flex-direction: row; |
|||
align-items: center; |
|||
flex-wrap: nowrap; |
|||
justify-content: flex-start; |
|||
width: 320px; |
|||
} |
|||
|
|||
.header-logo { |
|||
margin-right: 20px; |
|||
} |
|||
|
|||
.contact-us { |
|||
margin: 10px 0; |
|||
} |
|||
|
|||
.main-color { |
|||
color: #409eff; |
|||
} |
|||
|
|||
.step-item { |
|||
height: 550px; |
|||
overflow: auto; |
|||
padding: 20px; |
|||
} |
|||
|
|||
.container { |
|||
width: 800px; |
|||
margin: 0 auto; |
|||
} |
|||
|
|||
.container .el-card__body { |
|||
padding: 0 |
|||
} |
|||
|
|||
.next-button { |
|||
margin: 12px 0; |
|||
} |
|||
|
|||
.setting-version, |
|||
.install-process { |
|||
line-height: 1.3; |
|||
} |
|||
|
|||
.step-form { |
|||
width: 600px |
|||
} |
|||
|
|||
.el-input-group__append { |
|||
width: 190px; |
|||
} |
|||
|
|||
.footer-wrapper { |
|||
margin: 15px auto; |
|||
color: #888888 |
|||
} |
|||
|
|||
.fc-danger { |
|||
color: #f56c6c; |
|||
} |
|||
|
|||
.fc-warning { |
|||
color: #e6a23c; |
|||
} |
|||
|
|||
.fc-success { |
|||
color: #67c23a; |
|||
} |
|||
|
|||
.fc-info { |
|||
color: #909399; |
|||
} |
|||
|
|||
.fc-primary { |
|||
color: #409eff; |
|||
} |
|||
</style> |
|||
|
|||
</html> |
|||
Loading…
Reference in new issue