Merge commit 'd7d8ee481e720624225511e102773d1f2fc68e41' into pro

This commit is contained in:
kuaifan 2024-05-01 15:20:30 +08:00
commit 5fb242024a
65 changed files with 1806 additions and 49 deletions

View File

@ -1000,7 +1000,7 @@ class ApproveController extends AbstractController
}
//
try {
$msg = WebSocketDialogMsg::sendMsg($msg_action, $dialog->id, 'text', ['text' => $text, 'approve_type' => $type], $botUser->userid, false, false, true);
$msg = WebSocketDialogMsg::sendMsg($msg_action, $dialog->id, 'text', ['text' => $text, 'approve_type' => $type], $process['start_user_id'], false, false, true);
// 关联信息
if ($action == 'start') {
$proc_msg = new ApproveProcMsg();

View File

@ -0,0 +1,144 @@
<?php
namespace App\Http\Controllers\Api;
use Request;
use App\Models\User;
use App\Module\Base;
use App\Models\Complaint;
use App\Models\WebSocketDialog;
/**
* @apiDefine dialog
*
* 投诉
*/
class ComplaintController extends AbstractController
{
/**
* @api {get} api/complaint/lists 01. 获取举报投诉列表
*
* @apiDescription 需要token身份
* @apiVersion 1.0.0
* @apiGroup dialog
* @apiName lists
*
* @apiParam {Number} [type] 类型
* @apiParam {Number} [status] 状态
*
* @apiParam {Number} [page] 当前页,默认:1
* @apiParam {Number} [pagesize] 每页显示数量,默认:50,最大:100
*
* @apiSuccess {Number} ret 返回状态码1正确、0错误
* @apiSuccess {String} msg 返回信息(错误描述)
* @apiSuccess {Object} data 返回数据
*/
public function lists()
{
$user = User::auth();
$user->identity('admin');
//
$type = intval(Request::input('type'));
$status = Request::input('status');
//
$complaints = Complaint::query()
->when($type, function($q) use($type) {
$q->where('type', $type);
})
->when($status != "", function($q) use($status) {
$q->where('status', $status);
})
->orderByDesc('id')
->paginate(Base::getPaginate(100, 50));
//
return Base::retSuccess('success', $complaints);
}
/**
* @api {get} api/complaint/submit 02. 举报投诉
*
* @apiDescription 需要token身份
* @apiVersion 1.0.0
* @apiGroup dialog
* @apiName submit
*
* @apiParam {Number} dialog_id 对话ID
* @apiParam {Number} type 类型
* @apiParam {String} reason 原因
* @apiParam {String} imgs 图片
*
* @apiSuccess {Number} ret 返回状态码1正确、0错误
* @apiSuccess {String} msg 返回信息(错误描述)
* @apiSuccess {Object} data 返回数据
*/
public function submit()
{
$user = User::auth();
//
$dialog_id = intval(Request::input('dialog_id'));
$type = intval(Request::input('type'));
$reason = trim(Request::input('reason'));
$imgs = Request::input('imgs');
//
WebSocketDialog::checkDialog($dialog_id);
//
if (!$type) {
return Base::retError('请选择举报类型');
}
if (!$reason) {
return Base::retError('请填写举报原因');
}
//
$report_imgs = [];
if (!empty($imgs) && is_array($imgs)) {
foreach ($imgs as $img) {
$report_imgs[] = Base::unFillUrl($img['path']);
}
}
//
Complaint::createInstance([
'dialog_id' => $dialog_id,
'userid' => $user->userid,
'type' => $type,
'reason' => $reason,
'imgs' => $report_imgs,
])->save();
//
return Base::retSuccess('success');
}
/**
* @api {get} api/complaint/action 03. 举报投诉 - 操作
*
* @apiDescription 需要token身份
* @apiVersion 1.0.0
* @apiGroup dialog
* @apiName action
*
* @apiParam {Number} id ID
* @apiParam {Number} type 类型
*
* @apiSuccess {Number} ret 返回状态码1正确、0错误
* @apiSuccess {String} msg 返回信息(错误描述)
* @apiSuccess {Object} data 返回数据
*/
public function action()
{
$user = User::auth();
$user->identity('admin');
//
$id = intval(Request::input('id'));
$type = trim(Request::input('type'));
//
if ($type == 'handle') {
Complaint::whereId($id)->update([
"status" => 1
]);
}
if ($type == 'delete') {
Complaint::whereId($id)->delete();
}
//
return Base::retSuccess('success');
}
}

41
app/Models/Complaint.php Normal file
View File

@ -0,0 +1,41 @@
<?php
namespace App\Models;
/**
* App\Models\Complaint
*
* @property int $id
* @property int|null $dialog_id 对话ID
* @property int|null $userid 举报人id
* @property int|null $type 举报类型
* @property string|null $reason 举报原因
* @property string|null $imgs 举报图片
* @property int|null $status 状态 0待处理、1已处理、2已删除
* @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
* @method static \Illuminate\Database\Eloquent\Builder|AbstractModel cancelAppend()
* @method static \Illuminate\Database\Eloquent\Builder|AbstractModel cancelHidden()
* @method static \Illuminate\Database\Eloquent\Builder|AbstractModel change($array)
* @method static \Illuminate\Database\Eloquent\Builder|AbstractModel getKeyValue()
* @method static \Illuminate\Database\Eloquent\Builder|Complaint newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder|Complaint newQuery()
* @method static \Illuminate\Database\Eloquent\Builder|Complaint query()
* @method static \Illuminate\Database\Eloquent\Builder|AbstractModel remove()
* @method static \Illuminate\Database\Eloquent\Builder|AbstractModel saveOrIgnore()
* @method static \Illuminate\Database\Eloquent\Builder|Complaint whereCreatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|Complaint whereDialogId($value)
* @method static \Illuminate\Database\Eloquent\Builder|Complaint whereId($value)
* @method static \Illuminate\Database\Eloquent\Builder|Complaint whereImgs($value)
* @method static \Illuminate\Database\Eloquent\Builder|Complaint whereReason($value)
* @method static \Illuminate\Database\Eloquent\Builder|Complaint whereStatus($value)
* @method static \Illuminate\Database\Eloquent\Builder|Complaint whereType($value)
* @method static \Illuminate\Database\Eloquent\Builder|Complaint whereUpdatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|Complaint whereUserid($value)
* @mixin \Eloquent
*/
class Complaint extends AbstractModel
{
}

View File

@ -1666,7 +1666,9 @@ class ProjectTask extends AbstractModel
if (empty($receivers)) {
return;
}
//
$userid = User::userid();
//
$botUser = User::botGetOrCreate('task-alert');
if (empty($botUser)) {
return;
@ -1698,7 +1700,7 @@ class ProjectTask extends AbstractModel
ProjectTaskPushLog::createInstance($data)->save();
WebSocketDialogMsg::sendMsg(null, $dialog->id, 'text', [
'text' => str_replace("您的任务", $replace, $text) . $suffix
], $botUser->userid);
], in_array($type, [0, 3]) ? $userid : $botUser->userid);
}
}
}
@ -1714,41 +1716,48 @@ class ProjectTask extends AbstractModel
*/
public function moveTask(int $projectId, int $columnId,int $flowItemId = 0,array $owner = [], array $assist = [])
{
AbstractModel::transaction(function () use($projectId, $columnId, $flowItemId, $owner, $assist) {
AbstractModel::transaction(function () use ($projectId, $columnId, $flowItemId, $owner, $assist) {
$newTaskUser = array_merge($owner, $assist);
//
$this->project_id = $projectId;
$this->column_id = $columnId;
$this->flow_item_id = $flowItemId;
// 任务内容
if($this->content){
if ($this->content) {
$this->content->project_id = $projectId;
$this->content->save();
}
// 任务文件
foreach ($this->taskFile as $taskFile){
foreach ($this->taskFile as $taskFile) {
$taskFile->project_id = $projectId;
$taskFile->save();
}
// 任务标签
foreach ($this->taskTag as $taskTag){
foreach ($this->taskTag as $taskTag) {
$taskTag->project_id = $projectId;
$taskTag->save();
}
// 任务用户
$this->updateTask(['owner' => $owner]);
$this->updateTask(['assist' => $assist]);
foreach ($this->taskUser as $taskUser){
if( in_array($taskUser->id, $newTaskUser) ){
$this->updateTask([
'owner' => $owner,
'assist' => $assist
]);
foreach ($this->taskUser as $taskUser) {
if (in_array($taskUser->id, $newTaskUser)) {
$taskUser->project_id = $projectId;
$taskUser->save();
}
}
//
if($flowItemId){
if ($flowItemId) {
$flowItem = projectFlowItem::whereProjectId($projectId)->whereId($flowItemId)->first();
$this->flow_item_id = $flowItemId;
$this->flow_item_name = $flowItem->status . "|" . $flowItem->name;
}else{
if ($flowItem->status == 'end') {
$this->completeTask(Carbon::now(), $flowItem->name);
} else {
$this->completeTask(null);
}
} else {
$this->flow_item_name = '';
}
//

View File

@ -11,6 +11,8 @@ use App\Exceptions\ApiException;
* @property int $id
* @property int|null $project_id 项目ID
* @property int|null $task_id 任务ID
* @property int|null $userid 用户ID
* @property string|null $desc 内容描述
* @property string|null $content 内容
* @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
@ -25,10 +27,12 @@ use App\Exceptions\ApiException;
* @method static \Illuminate\Database\Eloquent\Builder|AbstractModel saveOrIgnore()
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTaskContent whereContent($value)
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTaskContent whereCreatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTaskContent whereDesc($value)
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTaskContent whereId($value)
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTaskContent whereProjectId($value)
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTaskContent whereTaskId($value)
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTaskContent whereUpdatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTaskContent whereUserid($value)
* @mixin \Eloquent
*/
class ProjectTaskContent extends AbstractModel

View File

@ -0,0 +1,37 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateComplaintsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('complaints', function (Blueprint $table) {
$table->bigIncrements('id');
$table->bigInteger('dialog_id')->nullable()->default(0)->comment('对话ID');
$table->bigInteger('userid')->nullable()->default(0)->comment('举报人id');
$table->bigInteger('type')->nullable()->default(0)->comment('举报类型');
$table->string('reason', 500)->nullable()->default('')->comment('举报原因');
$table->text('imgs')->nullable()->comment('举报图片');
$table->bigInteger('status')->nullable()->default(0)->comment('状态 0待处理、1已处理、2已删除');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('complaints');
}
}

View File

@ -494,3 +494,6 @@ Api接口文档
注册失败
会议已结束
请选择举报类型
请填写举报原因

View File

@ -1569,3 +1569,28 @@ License Key
任务描述历史记录
描述
数据加载失败
举报管理
举报类型
举报状态
已处理
诈骗诱导转账
引流下载其他APP付费
敲诈勒索
照片与本人不一致
色情低俗
频繁广告骚扰
其他问题
举报人
你确定要处理吗?
你确定要删除吗?
请选择举报类型
请填写举报原因
举报成功
匿名举报
请输入举报原因
请输入填写详细的举报原因,以使我们更好的帮助你解决问题
转发成功
举报原因
举报图
举报投诉

View File

@ -20205,5 +20205,236 @@
"de": "Datenproblem nicht geladen.",
"fr": "Échec du chargement des données",
"id": "Pemuatan data gagal"
},
{
"key": "请选择举报类型",
"zh": "",
"zh-CHT": "請選擇舉報類型",
"en": "Please select a report type",
"ko": "제보 유형을 선택하세요",
"ja": "通報の種類を選択します。",
"de": "Bitte wählen sie den art der meldung",
"fr": "Veuillez sélectionner un type de dénonciation",
"id": "Silahkan pilih jenis laporan"
},
{
"key": "请填写举报原因",
"zh": "",
"zh-CHT": "請填寫舉報原因",
"en": "Please fill in the report reason",
"ko": "고발 사유를 기재하시오",
"ja": "通報理由をお願いします。",
"de": "Bitte füllen sie ihren bericht aus",
"fr": "Veuillez renseigner la raison du signalement",
"id": "Silahkan mengisi untuk alasan pelaporan"
},
{
"key": "举报管理",
"zh": "",
"zh-CHT": "舉報管理",
"en": "Reporting management",
"ko": "고발 관리",
"ja": "通報管理です",
"de": "Management meldet:",
"fr": "Gestion des signalements",
"id": "Melaporkan manajemen"
},
{
"key": "举报类型",
"zh": "",
"zh-CHT": "舉報類型",
"en": "Reporting type",
"ko": "신고 유형",
"ja": "通報タイプです",
"de": "Art der meldung",
"fr": "Types de signalements",
"id": "Tipe pelaporan"
},
{
"key": "举报状态",
"zh": "",
"zh-CHT": "舉報狀態",
"en": "Reporting status",
"ko": "신고 상태",
"ja": "通報状態です",
"de": "Meldung über den stand.",
"fr": "État des signalements",
"id": "Laporkan status"
},
{
"key": "已处理",
"zh": "",
"zh-CHT": "已處理",
"en": "Processed",
"ko": "처리됨",
"ja": "処理済みです",
"de": "Wir kümmern uns darum.",
"fr": "A été traité",
"id": "Sudah ditangani"
},
{
"key": "诈骗诱导转账",
"zh": "",
"zh-CHT": "詐騙誘導轉賬",
"en": "Fraud-induced transfer",
"ko": "사기 유도 이체",
"ja": "詐欺誘導振り込みです",
"de": "Ein köder.",
"fr": "Transferts induits par fraude",
"id": "Melakukan penipuan"
},
{
"key": "引流下载其他APP付费",
"zh": "",
"zh-CHT": "引流下載其他APP付費",
"en": "Diversion download other apps pay",
"ko": "유료 다운로드 다른 앱",
"ja": "有料で他のアプリをダウンロードします",
"de": "Weitere APP gratis downloaden",
"fr": "Drainage télécharger autre APP payer",
"id": "- download streaming untuk aplikasi lain"
},
{
"key": "敲诈勒索",
"zh": "",
"zh-CHT": "敲詐勒索",
"en": "Extortion",
"ko": "사기를 쳐서 재물을 갈취하다.",
"ja": "ゆすりゆすりです",
"de": "Erpressung und so weiter.",
"fr": "Extorsion et extorsion",
"id": "Pemerasan."
},
{
"key": "照片与本人不一致",
"zh": "",
"zh-CHT": "照片與本人不一致",
"en": "The photo does not match me",
"ko": "사진이 본인과 일치하지 않다",
"ja": "写真と本人が一致しません",
"de": "Das foto passt nicht zu dem bild",
"fr": "La photo ne correspond pas à moi",
"id": "Foto tidak sesuai dengan saya"
},
{
"key": "色情低俗",
"zh": "",
"zh-CHT": "色情低俗",
"en": "Pornographic and vulgar",
"ko": "색정적이고 저속하다.",
"ja": "下品なポルノです",
"de": "Pornografie ist vulgär.",
"fr": "Érotique vulgaire",
"id": "Porno kotor"
},
{
"key": "频繁广告骚扰",
"zh": "",
"zh-CHT": "頻繁廣告騷擾",
"en": "Frequent advertising harassment",
"ko": "잦은 광고 소동",
"ja": "頻繁な広告ハラスメントです",
"de": "Unmengen Von anzeigen.",
"fr": "Harcèlement publicitaire fréquent",
"id": "Sering mengganggu iklan"
},
{
"key": "其他问题",
"zh": "",
"zh-CHT": "其他問題",
"en": "Other questions",
"ko": "그 밖의 문제",
"ja": "その他の問題です",
"de": "Noch andere fragen.",
"fr": "Pour toute autre question",
"id": "Masalah lain"
},
{
"key": "举报人",
"zh": "",
"zh-CHT": "舉報人",
"en": "Informer",
"ko": "고발인",
"ja": "通報者です",
"de": "Der anrufer.",
"fr": "Le dénonciateur",
"id": "Pembawa berita"
},
{
"key": "你确定要处理吗?",
"zh": "",
"zh-CHT": "你確定要處理嗎?",
"en": "Are you sure you want to handle this?",
"ko": "정말로 처리하실 겁니까?",
"ja": "処理することは確実ですか?",
"de": "Hast du wirklich vor, dich darum zu kümmern?",
"fr": "Êtes-vous sûr de vouloir traiter?",
"id": "Kau yakin ingin menanganinya?"
},
{
"key": "你确定要删除吗?",
"zh": "",
"zh-CHT": "你確定要刪除嗎?",
"en": "Are you sure you want to delete it?",
"ko": "정말로 삭제하시겠습니까?",
"ja": "削除しますか?",
"de": "Willst du es wirklich löschen?",
"fr": "Êtes-vous sûr de vouloir supprimer?",
"id": "Kau yakin ingin menghapusnya?"
},
{
"key": "举报成功",
"zh": "",
"zh-CHT": "舉報成功",
"en": "Report success",
"ko": "신고가 성공하다",
"ja": "通報できました",
"de": "Melde erfolg.",
"fr": "Signaler un succès",
"id": "Laporkan sukses"
},
{
"key": "匿名举报",
"zh": "",
"zh-CHT": "匿名舉報",
"en": "Anonymous report",
"ko": "익명으로 고발하다.",
"ja": "匿名の通報です",
"de": "Anonymer tipp.",
"fr": "Signaler de manière anonyme",
"id": "Laporan anonim"
},
{
"key": "请输入举报类型:",
"zh": "",
"zh-CHT": "請輸入舉報類型:",
"en": "Please enter the report type:",
"ko": "제보 유형을 입력하십시오:",
"ja": "通報の種類を入力してくださいます:",
"de": "Bitte geben sie den melanchentyp ein:",
"fr": "Veuillez entrer le type de signalement:",
"id": "Silakan masukkan tipe laporan:"
},
{
"key": "请输入举报原因:",
"zh": "",
"zh-CHT": "請輸入舉報原因:",
"en": "Please enter the reason for reporting:",
"ko": "제보하는 이유를 입력해주세요:",
"ja": "通報理由を入力してくださいます:",
"de": "Bitte geben sie einen grund ein:",
"fr": "Veuillez saisir la raison de votre signalement:",
"id": "Mohon masukkan alasan pelaporan:"
},
{
"key": "请输入填写详细的举报原因,以使我们更好的帮助你解决问题",
"zh": "",
"zh-CHT": "請輸入填寫詳細的舉報原因,以使我們更好的幫助你解決問題",
"en": "Please fill in the detailed report reason, so that we can better help you solve the problem",
"ko": "자세한 제보 원인을 입력하여 기입하십시요, 더 나은 문제 해결에 도움이 되도록",
"ja": "通報の詳細な原因を記入してください、あなたの問題を解決するために私たちを助けます。",
"de": "Bitte geben sie einen detaillierten hinweis ein, warum sie ihre probleme lösen sollen",
"fr": "Sil vous plaît entrer la raison de remplir les détails pour nous permettre de mieux vous aider à résoudre le problème",
"id": "Silakan ketik alasan kami mengisi laporan lengkap untuk memberikan bantuan yang lebih baik dalam memecahkan masalah anda"
}
]

Binary file not shown.

View File

@ -0,0 +1,5 @@
<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
<path d="M1023.573333 730.1376c0 162.061653-131.37408 293.435733-293.435733 293.435733h-436.701867C131.377493 1023.573333 0 892.199253 0 730.1376v-436.701867C0 131.375787 131.377493 0 293.435733 0h436.701867C892.199253 0 1023.573333 131.375787 1023.573333 293.435733v436.701867z" fill="#3290FF"></path>
<path d="M511.812267 285.600427a1.6896 1.6896 0 0 1 0.861866 0.242346c0.438613 0.28672 0.781653 0.698027 0.98816 1.179307l252.29312 445.948587a3.67616 3.67616 0 0 1 0 3.623253l-0.339626 0.585387-0.319147 0.595626c-0.211627 0.382293-0.617813 0.626347-1.466027 0.626347H259.283627a1.194667 1.194667 0 0 1-1.06496-0.626347l-0.31744-0.595626-0.341334-0.585387a3.84 3.84 0 0 1 0.172374-3.92192l252.368213-446.097067c0.34304-0.6144 0.996693-0.991573 1.703253-0.976213m0-42.472107a44.35456 44.35456 0 0 0-38.90176 22.985387L220.777813 711.758507a46.13632 46.13632 0 0 0 0 46.047573 43.685547 43.685547 0 0 0 38.50752 23.067307h504.992427a43.67872 43.67872 0 0 0 38.519467-23.067307 46.13632 46.13632 0 0 0 0-46.047573l-252.2112-445.646507a44.43648 44.43648 0 0 0-38.826667-22.985387h0.044373z m0 0" fill="#FFFFFF"></path>
<path d="M540.29312 455.277227c-0.29696-15.42656-12.888747-27.772587-28.317013-27.772587s-28.018347 12.346027-28.315307 27.772587c0 0.817493 0 1.626453 0.11776 2.423466l6.9632 153.294507h42.473813l6.9632-153.294507c0.075093-0.79872 0.114347-1.605973 0.114347-2.423466z m0 0M483.662507 667.620693c0 15.63136 12.675413 28.311893 28.310186 28.311894 15.63648 0 28.3136-12.680533 28.3136-28.311894 0-15.63648-12.67712-28.315307-28.3136-28.315306-15.63648 0-28.310187 12.67712-28.310186 28.315306z m0 0" fill="#FFFFFF"></path>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

3
public/js/quill.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""]
["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""]

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
if(typeof window.LANGUAGE_DATA==="undefined")window.LANGUAGE_DATA={};window.LANGUAGE_DATA["zh"]=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""]
if(typeof window.LANGUAGE_DATA==="undefined")window.LANGUAGE_DATA={};window.LANGUAGE_DATA["zh"]=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""]

142
public/site/css/side_nav.css vendored Normal file
View File

@ -0,0 +1,142 @@
@font-face {
font-family: "official.iconfont";
src: url("../../css/fonts/side_nav_font.woff");
font-weight: normal;
font-style: normal
}
.side_nav{
position: fixed;
right: 20px;
bottom: 135px;
z-index: 100;
}
.side_nav .side_toolbars{
width: 48px;
padding: 4px;
box-sizing: border-box;
border-radius: 60px;
background-color: var(--pop-bg-color);
color: var(--text-color);
box-shadow: var(--pop-box-shadow);
}
.side_nav .side_toolbars .side_toolbar_item{
display: flex;
width: 40px;
height: 40px;
justify-content: center;
align-items: center;
border-radius: 50%;
cursor: pointer;
position: relative;
}
.side_nav .side_toolbars .side_toolbar_item .toolbar_font{
font-size: 24px;
height: 24px;
color: var(--text-color);
}
.side_nav .side_toolbars .side_toolbar_item .toolbar_font::after{
display: inline-block;
font-family: "official.iconfont";
font-style: normal;
font-weight: normal;
line-height: 1;
-webkit-font-smoothing: antialiased;
}
.side_nav .side_toolbars .side_toolbar_item .font_phone::after{
content: "\EA25";
}
.side_nav .side_toolbars .side_toolbar_item .font_qrcode::after{
content: "\EA28";
}
.side_nav .side_toolbars .side_toolbar_item .toolbar_tooltip{
position: absolute;
right: 40px;
top: 2px;
transform-origin: right center;
white-space: nowrap;
width: fit-content;
display: none;
background-color: var(--code-bg-color);
color: #fff;
margin-right: 12px;
border-radius: 4px;
padding: 10px;
z-index: 2000;
font-size: 12px;
line-height: 1.2;
min-width: 10px;
word-wrap: break-word;
text-align: center;
}
.side_nav .side_toolbars .side_toolbar_item .toolbar_tooltip .toolbar_whtasapp{
width: 120px;
height: 120px;
background-image: url('../img/side_nav_whatsapp.png');
background-repeat: no-repeat;
background-size: cover;
}
.side_nav .side_toolbars .side_toolbar_item .toolbar_tooltip .toolbar_qrcode{
width: 120px;
height: 120px;
background-image: url('../img/side_nav_wechat.png');
background-repeat: no-repeat;
background-size: cover;
}
.side_nav .side_toolbars .side_toolbar_item .toolbar_tooltip .tooltip_arrow{
position: absolute;
display: block;
width: 0;
height: 0;
border-color: transparent;
border-style: solid;
right: -5px;
top: 11px;
border-width: 6px;
border-right-width: 0;
border-left-color: var(--code-bg-color);
}
.side_nav .side_to_top{
width: 48px;
height: 48px;
background: #fff;
margin-top: 16px;
border-radius: 50%;
cursor: pointer;
position: relative;
display: none;
background-color: var(--pop-bg-color);
color: var(--text-color);
box-shadow: var(--pop-box-shadow);
}
.side_nav .side_to_top .side_to_top_wrapper{
height: 40px;
width: 40px;
padding: 4px;
display: flex;
box-sizing: border-box;
border-radius: 50%;
align-items: center;
justify-content: center;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.side_nav .side_to_top .side_to_top_wrapper svg{
transform: rotate(180deg);
fill: var(--text-color);
height: 24px;
width: 24px;
}
.font_whatsapp svg{
fill: var(--text-color);
}
.side_nav .side_toolbars .side_toolbar_item:hover,.side_nav .side_to_top .side_to_top_wrapper:hover{
background-color: var(--bg-hover-color);
}
.side_nav .side_toolbars .side_toolbar_item_whtasapp:hover .toolbar_tooltip_qq,
.side_nav .side_toolbars .side_toolbar_item_phone:hover .toolbar_tooltip_phone,
.side_nav .side_toolbars .side_toolbar_item_qrcode:hover .toolbar_tooltip_qrcode{
display: block;
}

View File

@ -389,6 +389,8 @@
</div>
</div>
</footer>
<!-- 侧边导航 -->
<div id="nav_wrap"></div>
</div>
</body>
<script src="//cdn.bootcdn.net/ajax/libs/axios/1.3.6/axios.js"></script>
@ -517,5 +519,31 @@
}
window.addEventListener('scroll', animateBoxes);
animateBoxes();
document.addEventListener('DOMContentLoaded', function() {
fetch('./sideNav.html')
.then(response => response.text())
.then(data => {
document.getElementById('nav_wrap').innerHTML = data;
// 回到顶部
const back_top_button = document.getElementById('back_to_top');
window.addEventListener('scroll', () => {
if (document.body.scrollTop > 20 || document.documentElement.scrollTop > 20) {
back_top_button.style.display = 'block';
} else {
back_top_button.style.display = 'none';
}
});
back_top_button.addEventListener('click', () => {
window.scrollTo({
top: 0,
behavior: 'smooth'
});
});
// 检查页面加载时的滚动位置以决定是否显示回到顶部按钮
if (document.documentElement.scrollTop > 20) {
back_top_button.style.display = 'block'; // 显示回到顶部按钮
}
});
});
</script>
</html>

View File

@ -340,6 +340,8 @@
</div>
</div>
</footer>
<!-- 侧边导航 -->
<div id="nav_wrap"></div>
</div>
</body>
<script src="../js/common.js"></script>
@ -483,5 +485,31 @@ if(!logsItem) {
}else{
updates.innerHTML = logsItem;
}
document.addEventListener('DOMContentLoaded', function() {
fetch('./sideNav.html')
.then(response => response.text())
.then(data => {
document.getElementById('nav_wrap').innerHTML = data;
// 回到顶部
const back_top_button = document.getElementById('back_to_top');
window.addEventListener('scroll', () => {
if (document.body.scrollTop > 20 || document.documentElement.scrollTop > 20) {
back_top_button.style.display = 'block';
} else {
back_top_button.style.display = 'none';
}
});
back_top_button.addEventListener('click', () => {
window.scrollTo({
top: 0,
behavior: 'smooth'
});
});
// 检查页面加载时的滚动位置以决定是否显示回到顶部按钮
if (document.documentElement.scrollTop > 20) {
back_top_button.style.display = 'block'; // 显示回到顶部按钮
}
});
});
</script>
</html>

View File

@ -80,8 +80,8 @@
>
<a
class="txt-4001418 txt-sub"
href="../en/privacy.html" target="_blank"
>Privacy Policy</a
href="../en/help.html"
>Help Center</a
>
</li>
@ -91,10 +91,13 @@
>
<a
class="txt-4001418 txt-sub"
href="../en/help.html"
>Help Center</a
href="../en/privacy.html" target="_blank"
>Privacy Policy</a
>
</li>
<li class="submenu-pop-item" onclick="changeMenu()">
<a class="txt-4001418 txt-sub" href="../../docs/index.html" target="_blank">API document</a>
</li>
</ol>
</li>
<li class="nav-ul-item">
@ -429,17 +432,20 @@
<li class="drawer-item" onclick="changeMenu()">
<a
class="txt-4001620 txt"
href="../en/privacy.html" target="_blank"
>Privacy Policy</a
href="../en/help.html"
>Help Center</a
>
</li>
<li class="drawer-item" onclick="changeMenu()">
<a
class="txt-4001620 txt"
href="../en/help.html"
>Help Center</a
href="../en/privacy.html" target="_blank"
>Privacy Policy</a
>
</li>
<li class="drawer-item" onclick="changeMenu()">
<a class="txt-4001620 txt" href="../../docs/index.html" target="_blank">API document</a>
</li>
</ol>
<div class="drawer-item" onclick="closeDraweHandle()">
<a class="txt-4001620 txt" href="../en/price.html"
@ -2370,6 +2376,8 @@
</div>
</div>
</footer>
<!-- 侧边导航 -->
<div id="nav_wrap"></div>
</div>
</body>
<script src="../js/common.js"></script>
@ -2476,5 +2484,31 @@
}
}
}
document.addEventListener('DOMContentLoaded', function() {
fetch('./sideNav.html')
.then(response => response.text())
.then(data => {
document.getElementById('nav_wrap').innerHTML = data;
// 回到顶部
const back_top_button = document.getElementById('back_to_top');
window.addEventListener('scroll', () => {
if (document.body.scrollTop > 20 || document.documentElement.scrollTop > 20) {
back_top_button.style.display = 'block';
} else {
back_top_button.style.display = 'none';
}
});
back_top_button.addEventListener('click', () => {
window.scrollTo({
top: 0,
behavior: 'smooth'
});
});
// 检查页面加载时的滚动位置以决定是否显示回到顶部按钮
if (document.documentElement.scrollTop > 20) {
back_top_button.style.display = 'block'; // 显示回到顶部按钮
}
});
});
</script>
</html>

View File

@ -532,6 +532,8 @@
</div>
</div>
</footer>
<!-- 侧边导航 -->
<div id="nav_wrap"></div>
</div>
</body>
<script src="../js/common.js"></script>
@ -745,5 +747,31 @@ const arcs = document.querySelector('.home_arc');
}
window.addEventListener('scroll', animateBoxes);
animateBoxes();
document.addEventListener('DOMContentLoaded', function() {
fetch('./sideNav.html')
.then(response => response.text())
.then(data => {
document.getElementById('nav_wrap').innerHTML = data;
// 回到顶部
const back_top_button = document.getElementById('back_to_top');
window.addEventListener('scroll', () => {
if (document.body.scrollTop > 20 || document.documentElement.scrollTop > 20) {
back_top_button.style.display = 'block';
} else {
back_top_button.style.display = 'none';
}
});
back_top_button.addEventListener('click', () => {
window.scrollTo({
top: 0,
behavior: 'smooth'
});
});
// 检查页面加载时的滚动位置以决定是否显示回到顶部按钮
if (document.documentElement.scrollTop > 20) {
back_top_button.style.display = 'block'; // 显示回到顶部按钮
}
});
});
</script>
</html>

View File

@ -289,6 +289,8 @@
</div>
</div>
</footer>
<!-- 侧边导航 -->
<div id="nav_wrap"></div>
</div>
</body>
<script src="../js/common.js"></script>
@ -527,5 +529,31 @@ function scrollHandler(){
}
}
}
document.addEventListener('DOMContentLoaded', function() {
fetch('./sideNav.html')
.then(response => response.text())
.then(data => {
document.getElementById('nav_wrap').innerHTML = data;
// 回到顶部
const back_top_button = document.getElementById('back_to_top');
window.addEventListener('scroll', () => {
if (document.body.scrollTop > 20 || document.documentElement.scrollTop > 20) {
back_top_button.style.display = 'block';
} else {
back_top_button.style.display = 'none';
}
});
back_top_button.addEventListener('click', () => {
window.scrollTo({
top: 0,
behavior: 'smooth'
});
});
// 检查页面加载时的滚动位置以决定是否显示回到顶部按钮
if (document.documentElement.scrollTop > 20) {
back_top_button.style.display = 'block'; // 显示回到顶部按钮
}
});
});
</script>
</html>

View File

@ -1271,6 +1271,8 @@
</div>
</div>
</footer>
<!-- 侧边导航 -->
<div id="nav_wrap"></div>
</div>
</body>
<script src="../js/common.js">
@ -1308,5 +1310,31 @@
const box = document.querySelector('.BulletBox1')
box.style.display = 'none'
})
document.addEventListener('DOMContentLoaded', function() {
fetch('./sideNav.html')
.then(response => response.text())
.then(data => {
document.getElementById('nav_wrap').innerHTML = data;
// 回到顶部
const back_top_button = document.getElementById('back_to_top');
window.addEventListener('scroll', () => {
if (document.body.scrollTop > 20 || document.documentElement.scrollTop > 20) {
back_top_button.style.display = 'block';
} else {
back_top_button.style.display = 'none';
}
});
back_top_button.addEventListener('click', () => {
window.scrollTo({
top: 0,
behavior: 'smooth'
});
});
// 检查页面加载时的滚动位置以决定是否显示回到顶部按钮
if (document.documentElement.scrollTop > 20) {
back_top_button.style.display = 'block'; // 显示回到顶部按钮
}
});
});
</script>
</html>

View File

@ -634,6 +634,8 @@
</div>
</div>
</footer>
<!-- 侧边导航 -->
<div id="nav_wrap"></div>
</div>
</body>
<script src="../js/common.js"></script>
@ -718,5 +720,31 @@
}
window.addEventListener('scroll', animateBoxes);
animateBoxes();
document.addEventListener('DOMContentLoaded', function() {
fetch('./sideNav.html')
.then(response => response.text())
.then(data => {
document.getElementById('nav_wrap').innerHTML = data;
// 回到顶部
const back_top_button = document.getElementById('back_to_top');
window.addEventListener('scroll', () => {
if (document.body.scrollTop > 20 || document.documentElement.scrollTop > 20) {
back_top_button.style.display = 'block';
} else {
back_top_button.style.display = 'none';
}
});
back_top_button.addEventListener('click', () => {
window.scrollTo({
top: 0,
behavior: 'smooth'
});
});
// 检查页面加载时的滚动位置以决定是否显示回到顶部按钮
if (document.documentElement.scrollTop > 20) {
back_top_button.style.display = 'block'; // 显示回到顶部按钮
}
});
});
</script>
</html>

View File

@ -0,0 +1,57 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Solutions - DooTask</title>
<meta name="google" value="notranslate">
<meta name="description" content="Lightweight open source online project task management tool to help teams efficiently advance their projects and make work easier.">
<meta name="keywords" content="China DooTask Task management Lightweight Hitosea Teamwork">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="../img/favicon.ico">
<link rel="stylesheet" type="text/css" href="../css/side_nav.css">
<link rel="stylesheet" type="text/css" href="../css/rem.css">
</head>
<body>
<nav class="side_nav">
<ul class="side_toolbars">
<li class="side_toolbar_item side_toolbar_item_phone">
<i class="toolbar_font font_phone"></i>
<div class="toolbar_tooltip toolbar_tooltip_phone">
Phone0771-3164099
<div class="tooltip_arrow"></div>
</div>
</li>
<li class="side_toolbar_item side_toolbar_item_whtasapp">
<i class="toolbar_font font_whatsapp">
<svg t="1714295618588" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5948" id="mx_n_1714295618589" width="24" height="24"><path d="M540.444444 56.888889c61.383111 0 120.32 12.117333 176.64 36.266667 56.035556 24.064 104.476444 56.433778 145.123556 97.080888 40.675556 40.647111 73.016889 89.088 97.080889 145.123556A443.648 443.648 0 0 1 995.555556 512c0 61.383111-12.117333 120.32-36.266667 176.64-24.064 56.035556-56.433778 104.476444-97.080889 145.123556-40.647111 40.675556-89.088 73.016889-145.123556 97.080888A443.648 443.648 0 0 1 540.444444 967.111111c-77.511111 0-150.072889-18.574222-217.258666-55.552l-11.804445-6.741333-9.415111-5.688889-151.694222 48.298667a28.472889 28.472889 0 0 1-36.977778-30.094223l0.568889-3.128889 0.853333-3.015111 49.009778-144.64-5.290666-7.907555A440.149333 440.149333 0 0 1 86.016 537.6l-0.540444-13.368889L85.333333 512c0-61.383111 12.117333-120.32 36.266667-176.64 24.064-56.035556 56.433778-104.476444 97.080889-145.123556 40.647111-40.675556 89.088-73.016889 145.123555-97.080888A443.648 443.648 0 0 1 540.444444 56.888889z m0 56.888889c-53.674667 0-104.988444 10.524444-154.225777 31.658666-49.493333 21.248-91.875556 49.578667-127.317334 85.020445-35.441778 35.441778-63.772444 77.824-85.020444 127.317333A386.759111 386.759111 0 0 0 142.222222 512c0 85.902222 25.258667 163.413333 76.088889 233.301333a28.444444 28.444444 0 0 1 4.835556 22.528l-0.910223 3.328-35.612444 104.988445 110.791111-35.242667a28.444444 28.444444 0 0 1 17.749333 0.170667l3.356445 1.365333 3.157333 1.820445C388.636444 888.32 461.368889 910.222222 540.444444 910.222222c53.674667 0 104.988444-10.524444 154.225778-31.658666 49.493333-21.248 91.875556-49.578667 127.317334-85.020445 35.441778-35.441778 63.772444-77.824 85.020444-127.317333A386.759111 386.759111 0 0 0 938.666667 512c0-53.674667-10.524444-104.988444-31.658667-154.225778-21.248-49.493333-49.578667-91.875556-85.020444-127.317333-35.441778-35.441778-77.824-63.772444-127.317334-85.020445A386.759111 386.759111 0 0 0 540.444444 113.777778z m-141.312 184.888889c1.706667 0 4.067556 0.170667 7.054223 0.483555l3.214222 0.369778c3.413333 0.426667 6.314667 0.711111 8.675555 0.796444l2.190223 0.056889c7.224889 0 12.288 1.251556 15.132444 3.697778 2.389333 2.076444 4.835556 6.058667 7.338667 11.946667l10.154666 26.453333 17.237334 46.990222c4.835556 13.767111 7.281778 21.589333 7.281778 23.495111 0 7.196444-5.319111 16.782222-15.985778 28.757334l-3.726222 4.096c-13.141333 13.909333-19.712 22.755556-19.712 26.567111 0 2.673778 0.938667 5.518222 2.844444 8.561778 12.942222 27.818667 32.369778 53.930667 58.311111 78.307555 19.171556 18.176 44.373333 35.555556 75.633778 52.195556l10.638222 5.518222c4.551111 2.645333 8.760889 3.982222 12.572445 3.982222 5.233778 0 14.307556-7.765333 27.221333-23.267555l3.612444-4.437334c14.876444-18.488889 24.775111-27.704889 29.724445-27.704889 4.636444 0 21.248 7.367111 49.834666 22.101334l17.237334 9.016889c24.860444 13.198222 38.115556 21.304889 39.793778 24.291555 0.768 1.905778 1.137778 4.778667 1.137777 8.590222 0 12.572444-3.242667 27.022222-9.728 43.406223-6.087111 14.876444-19.626667 27.335111-40.561777 37.432889-20.963556 10.097778-40.391111 15.160889-58.282667 15.160888-21.703111 0-57.912889-11.804444-108.572445-35.441777a326.115556 326.115556 0 0 1-97.137777-67.413334c-27.420444-27.818667-55.637333-63.061333-84.565334-105.728-27.448889-40.760889-40.96-77.710222-40.590222-110.848v-4.551111c1.137778-34.702222 15.246222-64.796444 42.296889-90.311111 9.130667-8.391111 19.057778-12.572444 29.724444-12.572444z" p-id="5949"></path></svg>
</i>
<div class="toolbar_tooltip toolbar_tooltip_qq">
<div class="toolbar_whtasapp"></div>
<span class="toolbar_qrcode_text">
WhatsApp
</span>
<div class="tooltip_arrow"></div>
</div>
</li>
<li class="side_toolbar_item side_toolbar_item_qrcode">
<i class="toolbar_font font_qrcode"></i>
<div class="toolbar_tooltip toolbar_tooltip_qrcode">
<div class="toolbar_qrcode"></div>
<span class="toolbar_qrcode_text">
WeChat
</span>
<div class="tooltip_arrow"></div>
</div>
</li>
</ul>
<div class="side_to_top" id="back_to_top">
<div class="side_to_top_wrapper">
<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
<path d="M4 12.2531C3.58579 12.2531 3.25 11.9173 3.25 11.5031C3.25 11.0889 3.58579 10.7531 4 10.7531L12 10.7531C12.4142 10.7531 12.75 11.0889 12.75 11.5031C12.75 11.9173 12.4142 12.2531 12 12.2531H4Z"></path>
<path d="M10.803 4.13636C11.0959 3.84346 11.5708 3.84346 11.8637 4.13636C12.1566 4.42925 12.1566 4.90412 11.8637 5.19702L8.53037 8.53035C8.38972 8.671 8.19895 8.75002 8.00004 8.75002C7.80113 8.75002 7.61036 8.671 7.46971 8.53035L4.13638 5.19702C3.84348 4.90412 3.84348 4.42925 4.13638 4.13636C4.42927 3.84346 4.90414 3.84346 5.19704 4.13636L8.00004 6.93936L10.803 4.13636Z"></path>
</svg>
</div>
</div>
</nav>
</body>
</html>

View File

@ -341,6 +341,8 @@
</div>
</div>
</footer>
<!-- 侧边导航 -->
<div id="nav_wrap"></div>
</div>
</body>
<script src="../js/common.js"></script>
@ -363,5 +365,31 @@
}
window.addEventListener('scroll', animateBoxes);
animateBoxes();
document.addEventListener('DOMContentLoaded', function() {
fetch('./sideNav.html')
.then(response => response.text())
.then(data => {
document.getElementById('nav_wrap').innerHTML = data;
// 回到顶部
const back_top_button = document.getElementById('back_to_top');
window.addEventListener('scroll', () => {
if (document.body.scrollTop > 20 || document.documentElement.scrollTop > 20) {
back_top_button.style.display = 'block';
} else {
back_top_button.style.display = 'none';
}
});
back_top_button.addEventListener('click', () => {
window.scrollTo({
top: 0,
behavior: 'smooth'
});
});
// 检查页面加载时的滚动位置以决定是否显示回到顶部按钮
if (document.documentElement.scrollTop > 20) {
back_top_button.style.display = 'block'; // 显示回到顶部按钮
}
});
});
</script>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

View File

@ -387,6 +387,8 @@
</div>
</div>
</footer>
<!-- 侧边导航 -->
<div id="nav_wrap"></div>
</div>
</body>
<script src="//cdn.bootcdn.net/ajax/libs/axios/1.3.6/axios.js"></script>
@ -517,5 +519,31 @@
}
window.addEventListener('scroll', animateBoxes);
animateBoxes();
document.addEventListener('DOMContentLoaded', function() {
fetch('./sideNav.html')
.then(response => response.text())
.then(data => {
document.getElementById('nav_wrap').innerHTML = data;
// 回到顶部
const back_top_button = document.getElementById('back_to_top');
window.addEventListener('scroll', () => {
if (document.body.scrollTop > 20 || document.documentElement.scrollTop > 20) {
back_top_button.style.display = 'block';
} else {
back_top_button.style.display = 'none';
}
});
back_top_button.addEventListener('click', () => {
window.scrollTo({
top: 0,
behavior: 'smooth'
});
});
// 检查页面加载时的滚动位置以决定是否显示回到顶部按钮
if (document.documentElement.scrollTop > 20) {
back_top_button.style.display = 'block'; // 显示回到顶部按钮
}
});
});
</script>
</html>

View File

@ -338,6 +338,8 @@
</div>
</div>
</footer>
<!-- 侧边导航 -->
<div id="nav_wrap"></div>
</div>
</body>
<script src="../js/common.js"></script>
@ -481,5 +483,31 @@ if(!logsItem) {
}else{
updates.innerHTML = logsItem;
}
document.addEventListener('DOMContentLoaded', function() {
fetch('./sideNav.html')
.then(response => response.text())
.then(data => {
document.getElementById('nav_wrap').innerHTML = data;
// 回到顶部
const back_top_button = document.getElementById('back_to_top');
window.addEventListener('scroll', () => {
if (document.body.scrollTop > 20 || document.documentElement.scrollTop > 20) {
back_top_button.style.display = 'block';
} else {
back_top_button.style.display = 'none';
}
});
back_top_button.addEventListener('click', () => {
window.scrollTo({
top: 0,
behavior: 'smooth'
});
});
// 检查页面加载时的滚动位置以决定是否显示回到顶部按钮
if (document.documentElement.scrollTop > 20) {
back_top_button.style.display = 'block'; // 显示回到顶部按钮
}
});
});
</script>
</html>

View File

@ -749,6 +749,8 @@
</div>
</div>
</footer>
<!-- 侧边导航 -->
<div id="nav_wrap"></div>
</div>
</body>
<script src="../js/common.js"></script>
@ -843,5 +845,31 @@ function scrollHandler(){
}
}
}
document.addEventListener('DOMContentLoaded', function() {
fetch('./sideNav.html')
.then(response => response.text())
.then(data => {
document.getElementById('nav_wrap').innerHTML = data;
// 回到顶部
const back_top_button = document.getElementById('back_to_top');
window.addEventListener('scroll', () => {
if (document.body.scrollTop > 20 || document.documentElement.scrollTop > 20) {
back_top_button.style.display = 'block';
} else {
back_top_button.style.display = 'none';
}
});
back_top_button.addEventListener('click', () => {
window.scrollTo({
top: 0,
behavior: 'smooth'
});
});
// 检查页面加载时的滚动位置以决定是否显示回到顶部按钮
if (document.documentElement.scrollTop > 20) {
back_top_button.style.display = 'block'; // 显示回到顶部按钮
}
});
});
</script>
</html>

View File

@ -531,6 +531,8 @@
</div>
</div>
</footer>
<!-- 侧边导航 -->
<div id="nav_wrap"></div>
</div>
</body>
<script src="../js/common.js"></script>
@ -745,5 +747,31 @@ const arcs = document.querySelector('.home_arc');
}
window.addEventListener('scroll', animateBoxes);
animateBoxes();
document.addEventListener('DOMContentLoaded', function() {
fetch('./sideNav.html')
.then(response => response.text())
.then(data => {
document.getElementById('nav_wrap').innerHTML = data;
// 回到顶部
const back_top_button = document.getElementById('back_to_top');
window.addEventListener('scroll', () => {
if (document.body.scrollTop > 20 || document.documentElement.scrollTop > 20) {
back_top_button.style.display = 'block';
} else {
back_top_button.style.display = 'none';
}
});
back_top_button.addEventListener('click', () => {
window.scrollTo({
top: 0,
behavior: 'smooth'
});
});
// 检查页面加载时的滚动位置以决定是否显示回到顶部按钮
if (document.documentElement.scrollTop > 20) {
back_top_button.style.display = 'block'; // 显示回到顶部按钮
}
});
});
</script>
</html>

View File

@ -289,6 +289,8 @@
</div>
</div>
</footer>
<!-- 侧边导航 -->
<div id="nav_wrap"></div>
</div>
</body>
<script src="../js/common.js"></script>
@ -525,5 +527,31 @@ function scrollHandler(){
}
}
}
document.addEventListener('DOMContentLoaded', function() {
fetch('./sideNav.html')
.then(response => response.text())
.then(data => {
document.getElementById('nav_wrap').innerHTML = data;
// 回到顶部
const back_top_button = document.getElementById('back_to_top');
window.addEventListener('scroll', () => {
if (document.body.scrollTop > 20 || document.documentElement.scrollTop > 20) {
back_top_button.style.display = 'block';
} else {
back_top_button.style.display = 'none';
}
});
back_top_button.addEventListener('click', () => {
window.scrollTo({
top: 0,
behavior: 'smooth'
});
});
// 检查页面加载时的滚动位置以决定是否显示回到顶部按钮
if (document.documentElement.scrollTop > 20) {
back_top_button.style.display = 'block'; // 显示回到顶部按钮
}
});
});
</script>
</html>

View File

@ -1279,6 +1279,8 @@
</div>
</div>
</footer>
<!-- 侧边导航 -->
<div id="nav_wrap"></div>
</div>
</body>
<script src="../js/common.js"></script>
@ -1314,5 +1316,31 @@
const box = document.querySelector('.BulletBox1')
box.style.display = 'none'
})
document.addEventListener('DOMContentLoaded', function() {
fetch('./sideNav.html')
.then(response => response.text())
.then(data => {
document.getElementById('nav_wrap').innerHTML = data;
// 回到顶部
const back_top_button = document.getElementById('back_to_top');
window.addEventListener('scroll', () => {
if (document.body.scrollTop > 20 || document.documentElement.scrollTop > 20) {
back_top_button.style.display = 'block';
} else {
back_top_button.style.display = 'none';
}
});
back_top_button.addEventListener('click', () => {
window.scrollTo({
top: 0,
behavior: 'smooth'
});
});
// 检查页面加载时的滚动位置以决定是否显示回到顶部按钮
if (document.documentElement.scrollTop > 20) {
back_top_button.style.display = 'block'; // 显示回到顶部按钮
}
});
});
</script>
</html>

View File

@ -636,6 +636,8 @@
</div>
</div>
</footer>
<!-- 侧边导航 -->
<div id="nav_wrap"></div>
</div>
</body>
<script src="../js/common.js"></script>
@ -719,5 +721,31 @@
}
window.addEventListener('scroll', animateBoxes);
animateBoxes();
document.addEventListener('DOMContentLoaded', function() {
fetch('./sideNav.html')
.then(response => response.text())
.then(data => {
document.getElementById('nav_wrap').innerHTML = data;
// 回到顶部
const back_top_button = document.getElementById('back_to_top');
window.addEventListener('scroll', () => {
if (document.body.scrollTop > 20 || document.documentElement.scrollTop > 20) {
back_top_button.style.display = 'block';
} else {
back_top_button.style.display = 'none';
}
});
back_top_button.addEventListener('click', () => {
window.scrollTo({
top: 0,
behavior: 'smooth'
});
});
// 检查页面加载时的滚动位置以决定是否显示回到顶部按钮
if (document.documentElement.scrollTop > 20) {
back_top_button.style.display = 'block'; // 显示回到顶部按钮
}
});
});
</script>
</html>

View File

@ -0,0 +1,58 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>DooTask - 最受欢迎的开源项目协助工具</title>
<meta name="google" value="notranslate">
<meta name="description" content="DooTask是一款轻量级的开源在线项目任务管理工具提供各类文档协作工具、在线思维导图、在线流程图、项目管理、任务分发、即时IM文件管理等工具。助力团队高效推进项目让工作更简单。">
<meta name="keywords" content="中国 DooTask 开源在线项目 任务管理工具 任务管理 轻量级 海豚有海 团队协作">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="../img/favicon.ico">
<link rel="stylesheet" type="text/css" href="../css/common.css">
<link rel="stylesheet" type="text/css" href="../css/side_nav.css">
<link rel="stylesheet" type="text/css" href="../css/rem.css">
</head>
<body>
<nav class="side_nav">
<ul class="side_toolbars">
<li class="side_toolbar_item side_toolbar_item_phone">
<i class="toolbar_font font_phone"></i>
<div class="toolbar_tooltip toolbar_tooltip_phone">
服务电话0771-3164099
<div class="tooltip_arrow"></div>
</div>
</li>
<li class="side_toolbar_item side_toolbar_item_whtasapp">
<i class="toolbar_font font_whatsapp">
<svg t="1714295618588" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5948" id="mx_n_1714295618589" width="24" height="24"><path d="M540.444444 56.888889c61.383111 0 120.32 12.117333 176.64 36.266667 56.035556 24.064 104.476444 56.433778 145.123556 97.080888 40.675556 40.647111 73.016889 89.088 97.080889 145.123556A443.648 443.648 0 0 1 995.555556 512c0 61.383111-12.117333 120.32-36.266667 176.64-24.064 56.035556-56.433778 104.476444-97.080889 145.123556-40.647111 40.675556-89.088 73.016889-145.123556 97.080888A443.648 443.648 0 0 1 540.444444 967.111111c-77.511111 0-150.072889-18.574222-217.258666-55.552l-11.804445-6.741333-9.415111-5.688889-151.694222 48.298667a28.472889 28.472889 0 0 1-36.977778-30.094223l0.568889-3.128889 0.853333-3.015111 49.009778-144.64-5.290666-7.907555A440.149333 440.149333 0 0 1 86.016 537.6l-0.540444-13.368889L85.333333 512c0-61.383111 12.117333-120.32 36.266667-176.64 24.064-56.035556 56.433778-104.476444 97.080889-145.123556 40.647111-40.675556 89.088-73.016889 145.123555-97.080888A443.648 443.648 0 0 1 540.444444 56.888889z m0 56.888889c-53.674667 0-104.988444 10.524444-154.225777 31.658666-49.493333 21.248-91.875556 49.578667-127.317334 85.020445-35.441778 35.441778-63.772444 77.824-85.020444 127.317333A386.759111 386.759111 0 0 0 142.222222 512c0 85.902222 25.258667 163.413333 76.088889 233.301333a28.444444 28.444444 0 0 1 4.835556 22.528l-0.910223 3.328-35.612444 104.988445 110.791111-35.242667a28.444444 28.444444 0 0 1 17.749333 0.170667l3.356445 1.365333 3.157333 1.820445C388.636444 888.32 461.368889 910.222222 540.444444 910.222222c53.674667 0 104.988444-10.524444 154.225778-31.658666 49.493333-21.248 91.875556-49.578667 127.317334-85.020445 35.441778-35.441778 63.772444-77.824 85.020444-127.317333A386.759111 386.759111 0 0 0 938.666667 512c0-53.674667-10.524444-104.988444-31.658667-154.225778-21.248-49.493333-49.578667-91.875556-85.020444-127.317333-35.441778-35.441778-77.824-63.772444-127.317334-85.020445A386.759111 386.759111 0 0 0 540.444444 113.777778z m-141.312 184.888889c1.706667 0 4.067556 0.170667 7.054223 0.483555l3.214222 0.369778c3.413333 0.426667 6.314667 0.711111 8.675555 0.796444l2.190223 0.056889c7.224889 0 12.288 1.251556 15.132444 3.697778 2.389333 2.076444 4.835556 6.058667 7.338667 11.946667l10.154666 26.453333 17.237334 46.990222c4.835556 13.767111 7.281778 21.589333 7.281778 23.495111 0 7.196444-5.319111 16.782222-15.985778 28.757334l-3.726222 4.096c-13.141333 13.909333-19.712 22.755556-19.712 26.567111 0 2.673778 0.938667 5.518222 2.844444 8.561778 12.942222 27.818667 32.369778 53.930667 58.311111 78.307555 19.171556 18.176 44.373333 35.555556 75.633778 52.195556l10.638222 5.518222c4.551111 2.645333 8.760889 3.982222 12.572445 3.982222 5.233778 0 14.307556-7.765333 27.221333-23.267555l3.612444-4.437334c14.876444-18.488889 24.775111-27.704889 29.724445-27.704889 4.636444 0 21.248 7.367111 49.834666 22.101334l17.237334 9.016889c24.860444 13.198222 38.115556 21.304889 39.793778 24.291555 0.768 1.905778 1.137778 4.778667 1.137777 8.590222 0 12.572444-3.242667 27.022222-9.728 43.406223-6.087111 14.876444-19.626667 27.335111-40.561777 37.432889-20.963556 10.097778-40.391111 15.160889-58.282667 15.160888-21.703111 0-57.912889-11.804444-108.572445-35.441777a326.115556 326.115556 0 0 1-97.137777-67.413334c-27.420444-27.818667-55.637333-63.061333-84.565334-105.728-27.448889-40.760889-40.96-77.710222-40.590222-110.848v-4.551111c1.137778-34.702222 15.246222-64.796444 42.296889-90.311111 9.130667-8.391111 19.057778-12.572444 29.724444-12.572444z" p-id="5949"></path></svg>
</i>
<div class="toolbar_tooltip toolbar_tooltip_qq">
<div class="toolbar_whtasapp"></div>
<span class="toolbar_qrcode_text">
WhatsApp
</span>
<div class="tooltip_arrow"></div>
</div>
</li>
<li class="side_toolbar_item side_toolbar_item_qrcode">
<i class="toolbar_font font_qrcode"></i>
<div class="toolbar_tooltip toolbar_tooltip_qrcode">
<div class="toolbar_qrcode"></div>
<span class="toolbar_qrcode_text">
微信客服
</span>
<div class="tooltip_arrow"></div>
</div>
</li>
</ul>
<div class="side_to_top" id="back_to_top">
<div class="side_to_top_wrapper">
<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
<path d="M4 12.2531C3.58579 12.2531 3.25 11.9173 3.25 11.5031C3.25 11.0889 3.58579 10.7531 4 10.7531L12 10.7531C12.4142 10.7531 12.75 11.0889 12.75 11.5031C12.75 11.9173 12.4142 12.2531 12 12.2531H4Z"></path>
<path d="M10.803 4.13636C11.0959 3.84346 11.5708 3.84346 11.8637 4.13636C12.1566 4.42925 12.1566 4.90412 11.8637 5.19702L8.53037 8.53035C8.38972 8.671 8.19895 8.75002 8.00004 8.75002C7.80113 8.75002 7.61036 8.671 7.46971 8.53035L4.13638 5.19702C3.84348 4.90412 3.84348 4.42925 4.13638 4.13636C4.42927 3.84346 4.90414 3.84346 5.19704 4.13636L8.00004 6.93936L10.803 4.13636Z"></path>
</svg>
</div>
</div>
</nav>
</body>
</html>

View File

@ -342,6 +342,8 @@
</div>
</div>
</footer>
<!-- 侧边导航 -->
<div id="nav_wrap"></div>
</div>
</body>
<script src="../js/common.js"></script>
@ -364,5 +366,31 @@
}
window.addEventListener('scroll', animateBoxes);
animateBoxes();
document.addEventListener('DOMContentLoaded', function() {
fetch('./sideNav.html')
.then(response => response.text())
.then(data => {
document.getElementById('nav_wrap').innerHTML = data;
// 回到顶部
const back_top_button = document.getElementById('back_to_top');
window.addEventListener('scroll', () => {
if (document.body.scrollTop > 20 || document.documentElement.scrollTop > 20) {
back_top_button.style.display = 'block';
} else {
back_top_button.style.display = 'none';
}
});
back_top_button.addEventListener('click', () => {
window.scrollTo({
top: 0,
behavior: 'smooth'
});
});
// 检查页面加载时的滚动位置以决定是否显示回到顶部按钮
if (document.documentElement.scrollTop > 20) {
back_top_button.style.display = 'block'; // 显示回到顶部按钮
}
});
});
</script>
</html>

View File

@ -281,6 +281,14 @@
<ProjectManagement v-if="allProjectShow"/>
</DrawerOverlay>
<!--举报投诉管理-->
<DrawerOverlay
v-model="complaintShow"
placement="right"
:size="1200">
<ComplaintManagement v-if="complaintShow"/>
</DrawerOverlay>
<!--查看归档项目-->
<DrawerOverlay
v-model="archivedProjectShow"
@ -322,9 +330,10 @@ import TaskModal from "./manage/components/TaskModal";
import CheckinExport from "./manage/components/CheckinExport";
import TaskExport from "./manage/components/TaskExport";
import ApproveExport from "./manage/components/ApproveExport";
import ComplaintManagement from "./manage/components/ComplaintManagement";
import MicroApps from "../components/MicroApps.vue";
import notificationKoro from "notification-koro1";
import {Store} from "le5le-store";
import MicroApps from "../components/MicroApps.vue";
import {MarkdownPreview} from "../store/markdown";
export default {
@ -344,7 +353,8 @@ export default {
ProjectManagement,
TeamManagement,
ProjectArchived,
MicroApps
MicroApps,
ComplaintManagement
},
directives: {longpress},
data() {
@ -399,6 +409,8 @@ export default {
operateItem: {},
needStartHome: false,
complaintShow: false,
}
},
@ -572,6 +584,7 @@ export default {
{path: 'archivedProject', name: '已归档的项目'},
{path: 'team', name: '团队管理', divided: true},
{path: 'complaint', name: '举报管理'},
])
} else {
array.push(...[
@ -769,6 +782,9 @@ export default {
path:'/manage/apps/' + ( path == 'okrManage' ? '/#/list' : '/#/analysis'),
});
return;
case 'complaint':
this.complaintShow = true;
return;
case 'logout':
$A.modalConfirm({
title: '退出登录',
@ -1090,6 +1106,7 @@ export default {
this.onAddShow()
break;
case 'allUser':
case 'complaint':
case 'workReport':
this.settingRoute(act)
break;

View File

@ -367,7 +367,8 @@ export default {
{ value: "ldap", label: "LDAP", sort: 16 },
{ value: "mail", label: "邮件通知", sort: 17 },
{ value: "appPush", label: "APP 推送", sort: 18 },
{ value: "allUser", label: "团队管理", sort: 19 }
{ value: "allUser", label: "团队管理", sort: 19 },
{ value: "complaint", label: "举报管理", sort: 20 }
])
}
adminApplyList = adminApplyList.map((h) => {

View File

@ -0,0 +1,318 @@
<template>
<div class="project-management">
<div class="management-title">
{{ $L('举报管理') }}
<div class="title-icon">
<Loading v-if="loadIng > 0" />
</div>
</div>
<div class="search-container lr">
<ul>
<li>
<div class="search-label">
{{ $L("举报类型") }}
</div>
<div class="search-content">
<Select v-model="keys.type" :placeholder="$L('全部')">
<Option value=" ">{{ $L('全部') }}</Option>
<Option v-for="(item, index) in typeList" :key="index" :value="item.id">{{ $L(item.label) }}
</Option>
</Select>
</div>
</li>
<li>
<div class="search-label">
{{ $L("举报状态") }}
</div>
<div class="search-content">
<Select v-model="keys.status" :placeholder="$L('全部')">
<Option value=" ">{{ $L('全部') }}</Option>
<Option :value="0">{{ $L('待处理') }}</Option>
<Option :value="1">{{ $L('已处理') }}</Option>
</Select>
</div>
</li>
<li class="search-button">
<Tooltip theme="light" placement="right" transfer-class-name="search-button-clear" transfer>
<Button :loading="loadIng > 0" type="primary" icon="ios-search"
@click="onSearch">{{ $L('搜索') }}</Button>
<div slot="content">
<Button v-if="keyIs" type="text" @click="keyIs = false">{{ $L('取消筛选') }}</Button>
<Button v-else :loading="loadIng > 0" type="text" @click="getLists">{{ $L('刷新') }}</Button>
</div>
</Tooltip>
</li>
</ul>
</div>
<div class="table-page-box">
<Table :columns="columns" :data="list" :loading="loadIng > 0" :no-data-text="$L(noText)" stripe />
<Page :total="total" :current="page" :page-size="pageSize" :disabled="loadIng > 0" :simple="windowPortrait"
:page-size-opts="[10, 20, 30, 50, 100]" show-elevator show-sizer show-total @on-change="setPage"
@on-page-size-change="setPageSize" />
</div>
</div>
</template>
<script>
export default {
name: "ComplaintManagement",
data() {
const typeList = [
{ id: 10, label: "诈骗诱导转账" },
{ id: 20, label: "引流下载其他APP付费" },
{ id: 30, label: "敲诈勒索" },
{ id: 40, label: "照片与本人不一致" },
{ id: 50, label: "色情低俗" },
{ id: 60, label: "频繁广告骚扰" },
{ id: 70, label: "其他问题" }
];
return {
loadIng: 0,
keys: {},
keyIs: false,
typeList: typeList,
columns: [
{
title: 'ID',
key: 'id',
width: 80,
render: (h, { row, column }) => {
return h('TableAction', {
props: {
column: column,
align: 'left'
}
}, [
h("div", row.id),
]);
}
},
{
title: this.$L('举报类型'),
key: 'type',
minWidth: 80,
render: (h, { row }) => {
const arr = [h('AutoTip', this.$L(typeList.find(h => h.id == row.type).label))];
return h('div', arr)
}
},
{
title: this.$L('状态'),
key: 'status',
minWidth: 60,
render: (h, { row }) => {
let text = row.status == 0 ? '未处理': '已处理';
return h('div', this.$L(text))
}
},
{
title: this.$L('举报原因'),
minWidth: 120,
render: (h, { row }) => {
return h('div', [h('AutoTip', row.reason)])
}
},
{
title: this.$L('举报图'),
minWidth: 100,
render: (h, { row }) => {
const arr = [];
const imgs = JSON.parse(row.imgs)?.map(path => {
return {
src: $A.apiUrl("../" + path),
}
});
imgs.forEach((item, index) => {
arr.push(h('img', {
attrs: {
src: item.src,
width: 70
},
on: {
click: () => {
this.$store.dispatch("previewImage", { index: index, list: imgs })
}
}
}))
});
return h('div', {
attrs: {
style: "display: flex;padding: 4px 0;gap: 10px;"
}
}, arr)
}
},
{
title: this.$L('举报人'),
minWidth: 60,
render: (h, { row }) => {
return h('UserAvatar', {
props: {
showName: true,
size: 22,
userid: row.userid,
}
})
}
},
{
title: this.$L('创建时间'),
key: 'created_at',
width: 168,
},
{
title: this.$L('操作'),
align: 'center',
width: 100,
render: (h, params) => {
const vNode = [
params.row.status == 0 && h('Poptip', {
props: {
title: this.$L('你确定要处理吗?'),
confirm: true,
transfer: true,
placement: 'left',
okText: this.$L('确定'),
cancelText: this.$L('取消'),
},
style: {
fontSize: '13px',
cursor: 'pointer',
color: '#84C56A',
},
on: {
'on-ok': () => {
this.handle(params.row);
}
},
}, this.$L('处理')),
h('Poptip', {
props: {
title: this.$L('你确定要删除吗?'),
confirm: true,
transfer: true,
placement: 'left',
okText: this.$L('确定'),
cancelText: this.$L('取消'),
},
style: {
marginLeft: '8px',
fontSize: '13px',
cursor: 'pointer',
color: '#f00',
},
on: {
'on-ok': () => {
this.delete(params.row);
}
},
}, this.$L('删除'))
];
return h('TableAction', {
props: {
column: params.column
}
}, vNode);
},
}
],
list: [],
page: 1,
pageSize: 20,
total: 0,
noText: ''
}
},
mounted() {
this.getLists();
},
watch: {
keyIs(v) {
if (!v) {
this.keys = {}
this.setPage(1)
}
}
},
methods: {
onSearch() {
this.page = 1;
this.getLists();
},
getLists() {
this.loadIng++;
this.$store.dispatch("call", {
url: 'complaint/lists',
data: {
type: this.keys.type,
status: this.keys.status,
page: Math.max(this.page, 1),
pagesize: Math.max($A.runNum(this.pageSize), 10),
},
}).then(({ data }) => {
this.page = data.current_page;
this.total = data.total;
this.list = data.data;
this.noText = '没有相关的数据';
}).catch(() => {
this.noText = '数据加载失败';
}).finally(_ => {
this.loadIng--;
})
},
setPage(page) {
this.page = page;
this.getLists();
},
setPageSize(pageSize) {
this.page = 1;
this.pageSize = pageSize;
this.getLists();
},
handle(row) {
this.loadIng++;
this.$store.dispatch("call", {
url: 'complaint/action',
data: {
id: row.id,
type: 'handle'
},
}).then(() => {
this.getLists();
}).catch(({ msg }) => {
$A.modalError(msg);
}).finally(_ => {
this.loadIng--;
})
},
delete(row) {
this.list = this.list.filter(({ id }) => id != row.id);
this.loadIng++;
this.$store.dispatch("call", {
url: 'complaint/action',
data: {
id: row.id,
type: 'delete'
},
}).then(() => {
this.getLists();
}).catch(({ msg }) => {
$A.modalError(msg);
this.getLists();
}).finally(_ => {
this.loadIng--;
})
}
}
}
</script>

View File

@ -0,0 +1,96 @@
<template>
<div class="dialog-complaint-info">
<div class="group-complaint-title">{{ $L('匿名举报') }}</div>
<div class="group-complaint-warp">
<div class="group-complaint-title underline required">{{ $L('请选择举报类型') }}:</div>
<div class="group-complaint-list">
<List>
<ListItem v-for="(item, index) in typeList" :key="index" :class="{ 'active': typeId == item.id }">
<div class="text" @click="onSelectType(item)">{{ $L(item.label) }}</div>
<RadioGroup v-model="typeId">
<Radio :label="item.id" :model-value="typeId">&nbsp;</Radio>
</RadioGroup>
</ListItem>
</List>
</div>
<!-- -->
<div class="group-complaint-title required">{{ $L('请输入举报原因') }}:</div>
<div class="group-complaint-reason">
<Input v-model="reason" type="textarea" maxlength="500" :autosize="{ minRows: 4, maxRows: 8 }"
:placeholder="$L('请输入填写详细的举报原因,以使我们更好的帮助你解决问题')" />
</div>
<div class="group-complaint-img">
<ImgUpload v-model="imgs" :num="5" :width="512" :height="512" :whcut="1"></ImgUpload>
</div>
</div>
<!-- -->
<div class="group-info-button">
<Button @click="onSubmit" type="primary" icon="md-add">{{ $L("提交") }}</Button>
</div>
</div>
</template>
<script>
import ImgUpload from "../../../components/ImgUpload";
export default {
name: "DialogComplaint",
components: { ImgUpload },
props: {
dialogId: {
type: Number,
default: 0
},
},
data() {
return {
typeList: [
{ id: 10, label: "诈骗诱导转账" },
{ id: 20, label: "引流下载其他APP付费" },
{ id: 30, label: "敲诈勒索" },
{ id: 40, label: "照片与本人不一致" },
{ id: 50, label: "色情低俗" },
{ id: 60, label: "频繁广告骚扰" },
{ id: 70, label: "其他问题" }
],
typeId: 0,
reason: '',
imgs: [],
}
},
methods: {
onSelectType(item) {
if (this.typeId == item.id) {
this.typeId = 0;
} else {
this.typeId = item.id;
}
},
onSubmit() {
if (!this.typeId) {
return $A.modalError("请选择举报类型");
}
if (!this.reason) {
return $A.modalError("请填写举报原因");
}
//
this.$store.dispatch("call", {
url: 'complaint/submit',
data: {
dialog_id: this.dialogId,
reason: this.reason,
type: this.typeId,
imgs: this.imgs
}
}).then(({ data }) => {
$A.modalSuccess("举报成功");
this.$emit("on-close")
}).catch(({ msg }) => {
$A.modalError(msg);
});
}
}
}
</script>

View File

@ -119,7 +119,7 @@
</Checkbox>
</CheckboxGroup>
<div class="btn-row">
<Button v-if="(voteData[msgData.msg.uuid] || []).length == 0" type="grey" disabled>{{$L("请选择后投票")}}</Button>
<Button v-if="(voteData[msgData.msg.uuid] || []).length == 0" class="ivu-btn-grey" disabled>{{$L("请选择后投票")}}</Button>
<Button v-else type="warning" :loading="msgData.msg._loadIng > 0" class="no-dark-content" @click="onVote('vote',msgData)">{{$L("立即投票")}}</Button>
</div>
</template>

View File

@ -77,6 +77,9 @@
@command="onDialogMenu">
<i class="taskfont dialog-menu-icon">&#xe6e9;</i>
<EDropdownMenu slot="dropdown">
<EDropdownItem v-if="dialogData.bot == 0" command="report">
<div>{{$L('举报投诉')}}</div>
</EDropdownItem>
<EDropdownItem command="searchMsg">
<div>{{$L('搜索消息')}}</div>
</EDropdownItem>
@ -556,6 +559,14 @@
<DialogGroupInfo v-if="groupInfoShow" :dialogId="dialogId" @on-close="groupInfoShow=false"/>
</DrawerOverlay>
<!--举报投诉-->
<DrawerOverlay
v-model="reportShow"
placement="right"
:size="500">
<DialogComplaint v-if="reportShow" :dialogId="dialogId" @on-close="reportShow=false"/>
</DrawerOverlay>
<!--群转让-->
<Modal
v-model="groupTransferShow"
@ -660,6 +671,7 @@ import UserSelect from "../../../components/UserSelect.vue";
import UserAvatarTip from "../../../components/UserAvatar/tip.vue";
import DialogGroupWordChain from "./DialogGroupWordChain";
import DialogGroupVote from "./DialogGroupVote";
import DialogComplaint from "./DialogComplaint";
import touchclick from "../../../directives/touchclick";
export default {
@ -678,6 +690,7 @@ export default {
ApproveDetails,
DialogGroupWordChain,
DialogGroupVote,
DialogComplaint,
},
directives: {touchclick},
@ -754,6 +767,7 @@ export default {
openId: 0,
dialogDrag: false,
groupInfoShow: false,
reportShow: false,
groupTransferShow: false,
groupTransferLoad: 0,
@ -2467,6 +2481,10 @@ export default {
case "exit":
this.onExitGroup()
break;
case "report":
this.reportShow = true
break;
}
},

View File

@ -261,6 +261,21 @@ body.dark-mode-reverse {
}
}
}
.open-approve-details {
.ivu-btn-primary {
background-color: #d34521;
border-color: #d34521;
}
.ivu-btn-grey {
background-color: #9e9e9e;
border-color: #969696;
&:hover {
background-color: #959595;
border-color: #959595;
}
}
}
}
.dialog-emoji {

View File

@ -28,3 +28,4 @@
@import "task-exist-tips";
@import "calendar";
@import "dialog-droup-word-chain";
@import "dialog-complaint-info";

View File

@ -0,0 +1,66 @@
.dialog-complaint-info {
display: flex;
flex-direction: column;
position: absolute;
top: 10px;
left: 0;
right: 0;
bottom: 0;
.group-complaint-title {
margin: 18px 24px 0;
color: #303133;
&.required:after {
content: "*";
color: #e61f1f;
font-size: 22px;
}
&.underline {
padding-bottom: 10px;
border-bottom: 1px solid #e8eaec;
text-decoration: none;
}
}
.group-complaint-warp {
height: calc(100% - 107px);
overflow: auto;
}
.group-complaint-list {
margin: 0 24px 0;
.ivu-list-item {
border-bottom: 1px solid #f9f9f9;
padding: 0;
&:active {
background-color: #fbfbfb;
}
.text {
width: calc(100% - 32px);
height: 100%;
padding: 12px 0;
}
}
}
.group-complaint-reason {
margin: 12px 24px 18px;
padding: auto;
}
.group-complaint-img {
margin: 12px 24px 18px;
}
.group-info-button {
display: flex;
align-items: center;
justify-content: center;
margin: 18px 24px;
cursor: pointer;
> button {
margin: 0 8px;
}
}
}

View File

@ -1691,6 +1691,13 @@
display: flex;
}
}
.open-approve-details {
.ivu-btn-grey {
background-color: #efefef;
border-color: #f3f3f3;
}
}
}
}
}

View File

@ -150,6 +150,9 @@
&.all-user {
background-image: url("../images/application/all-user.svg");
}
&.complaint {
background-image: url("../images/application/complaint.svg");
}
&.app-push {
background-image: url("../images/application/app-push.svg");
}

View File

@ -0,0 +1,5 @@
<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
<path d="M1023.573333 730.1376c0 162.061653-131.37408 293.435733-293.435733 293.435733h-436.701867C131.377493 1023.573333 0 892.199253 0 730.1376v-436.701867C0 131.375787 131.377493 0 293.435733 0h436.701867C892.199253 0 1023.573333 131.375787 1023.573333 293.435733v436.701867z" fill="#3290FF"></path>
<path d="M511.812267 285.600427a1.6896 1.6896 0 0 1 0.861866 0.242346c0.438613 0.28672 0.781653 0.698027 0.98816 1.179307l252.29312 445.948587a3.67616 3.67616 0 0 1 0 3.623253l-0.339626 0.585387-0.319147 0.595626c-0.211627 0.382293-0.617813 0.626347-1.466027 0.626347H259.283627a1.194667 1.194667 0 0 1-1.06496-0.626347l-0.31744-0.595626-0.341334-0.585387a3.84 3.84 0 0 1 0.172374-3.92192l252.368213-446.097067c0.34304-0.6144 0.996693-0.991573 1.703253-0.976213m0-42.472107a44.35456 44.35456 0 0 0-38.90176 22.985387L220.777813 711.758507a46.13632 46.13632 0 0 0 0 46.047573 43.685547 43.685547 0 0 0 38.50752 23.067307h504.992427a43.67872 43.67872 0 0 0 38.519467-23.067307 46.13632 46.13632 0 0 0 0-46.047573l-252.2112-445.646507a44.43648 44.43648 0 0 0-38.826667-22.985387h0.044373z m0 0" fill="#FFFFFF"></path>
<path d="M540.29312 455.277227c-0.29696-15.42656-12.888747-27.772587-28.317013-27.772587s-28.018347 12.346027-28.315307 27.772587c0 0.817493 0 1.626453 0.11776 2.423466l6.9632 153.294507h42.473813l6.9632-153.294507c0.075093-0.79872 0.114347-1.605973 0.114347-2.423466z m0 0M483.662507 667.620693c0 15.63136 12.675413 28.311893 28.310186 28.311894 15.63648 0 28.3136-12.680533 28.3136-28.311894 0-15.63648-12.67712-28.315307-28.3136-28.315306-15.63648 0-28.310187 12.67712-28.310186 28.315306z m0 0" fill="#FFFFFF"></path>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -8,8 +8,9 @@ use App\Http\Controllers\Api\DialogController;
use App\Http\Controllers\Api\PublicController;
use App\Http\Controllers\Api\ReportController;
use App\Http\Controllers\Api\SystemController;
use App\Http\Controllers\Api\ProjectController;
use App\Http\Controllers\Api\ApproveController;
use App\Http\Controllers\Api\ProjectController;
use App\Http\Controllers\Api\ComplaintController;
/*
|--------------------------------------------------------------------------
@ -51,6 +52,9 @@ Route::prefix('api')->middleware(['webapi'])->group(function () {
// 审批
Route::any('approve/{method}', ApproveController::class);
Route::any('approve/{method}/{action}', ApproveController::class);
// 投诉
Route::any('complaint/{method}', ComplaintController::class);
Route::any('complaint/{method}/{action}', ComplaintController::class);
});
/**