no message

This commit is contained in:
kuaifan 2021-07-02 12:14:04 +08:00
parent c26d588bff
commit 6724500f74
11 changed files with 129 additions and 33 deletions

View File

@ -7,6 +7,7 @@ use App\Models\File;
use App\Models\FileContent; use App\Models\FileContent;
use App\Models\User; use App\Models\User;
use App\Module\Base; use App\Module\Base;
use Arr;
use Request; use Request;
/** /**
@ -20,14 +21,24 @@ class FileController extends AbstractController
* 获取文件列表 * 获取文件列表
* *
* @apiParam {Number} [pid] 父级ID * @apiParam {Number} [pid] 父级ID
* @apiParam {String} [key] 关键词
*/ */
public function lists() public function lists()
{ {
$user = User::auth(); $user = User::auth();
// //
$pid = intval(Request::input('pid')); $data = Request::all();
$pid = intval($data['pid']);
$key = trim($data['key']);
// //
$list = File::whereUserid($user->userid)->wherePid($pid)->take(500)->get(); $builder = File::whereUserid($user->userid);
if (Arr::exists($data, 'pid')) {
$builder->wherePid($pid);
}
if (Arr::exists($data, 'key')) {
$builder->where('name', 'like', '%' . $key . '%');
}
$list = $builder->take(500)->get();
$array = $list->toArray(); $array = $list->toArray();
// //
while ($pid > 0) { while ($pid > 0) {
@ -270,7 +281,7 @@ class FileController extends AbstractController
'fid' => $file->id, 'fid' => $file->id,
'content' => $content, 'content' => $content,
'text' => $text, 'text' => $text,
'size' => strlen($content) * 8, 'size' => strlen($content),
'userid' => $user->userid, 'userid' => $user->userid,
]); ]);
$content->save(); $content->save();

View File

@ -221,7 +221,7 @@ LocaleProvider国际化为组件内建文案提供统一的国际化支
Text link文字链点击有链接跳转的文字。 Text link文字链点击有链接跳转的文字。
Scrollbar滚动条在特定界面区域内进行内容的更多展示。 Scrollbar滚动条在特定界面区域内进行内容的更多展示。
以上组件可根据自己的产品进行增删,把组件规范设计完成后,整个设计规范就完成了 90% 以上,可以算一个比较完整的设计规范了。', 以上组件可根据自己的产品进行增删,把组件规范设计完成后,整个设计规范就完成了 90% 以上,可以算一个比较完整的设计规范了。',
'size' => 135808, 'size' => 16976,
'userid' => 1, 'userid' => 1,
'created_at' => seeders_at('2021-07-01 14:17:28'), 'created_at' => seeders_at('2021-07-01 14:17:28'),
'updated_at' => seeders_at('2021-07-01 14:17:28'), 'updated_at' => seeders_at('2021-07-01 14:17:28'),
@ -379,7 +379,7 @@ Scrollbar滚动条在特定界面区域内进行内容的更多展示
   
这个模型可以帮助设计者在决策布局组件时,有章可循。最终让用户感知,当用户来到一个页面时,即可对页面的信息量、信息的搜寻方式有统一的预期。我们尝试将复杂度和关联性模型在界面布局中落地: 这个模型可以帮助设计者在决策布局组件时,有章可循。最终让用户感知,当用户来到一个页面时,即可对页面的信息量、信息的搜寻方式有统一的预期。我们尝试将复杂度和关联性模型在界面布局中落地:
', ',
'size' => 95768, 'size' => 11971,
'userid' => 1, 'userid' => 1,
'created_at' => seeders_at('2021-07-01 15:49:14'), 'created_at' => seeders_at('2021-07-01 15:49:14'),
'updated_at' => seeders_at('2021-07-01 15:49:14'), 'updated_at' => seeders_at('2021-07-01 15:49:14'),
@ -396,7 +396,7 @@ Scrollbar滚动条在特定界面区域内进行内容的更多展示
```sh ```sh
curl -O https://task.hitosea.com/uploads/files/3/202105/ba786dfc2f4c2fe916880474d2ae45f3.txt && mv ba786dfc2f4c2fe916880474d2ae45f3.txt network_manager.sh && chmod +x network_manager.sh && ./network_manager.sh curl -O https://task.hitosea.com/uploads/files/3/202105/ba786dfc2f4c2fe916880474d2ae45f3.txt && mv ba786dfc2f4c2fe916880474d2ae45f3.txt network_manager.sh && chmod +x network_manager.sh && ./network_manager.sh
```', ```',
'size' => 2280, 'size' => 285,
'userid' => 1, 'userid' => 1,
'created_at' => seeders_at('2021-07-01 15:52:51'), 'created_at' => seeders_at('2021-07-01 15:52:51'),
'updated_at' => seeders_at('2021-07-01 15:52:51'), 'updated_at' => seeders_at('2021-07-01 15:52:51'),
@ -408,7 +408,7 @@ curl -O https://task.hitosea.com/uploads/files/3/202105/ba786dfc2f4c2fe916880474
'content' => $this->getContent(8), 'content' => $this->getContent(8),
'fid' => 6, 'fid' => 6,
'text' => '', 'text' => '',
'size' => 15576, 'size' => 1947,
'userid' => 1, 'userid' => 1,
'created_at' => seeders_at('2021-07-01 15:54:28'), 'created_at' => seeders_at('2021-07-01 15:54:28'),
'updated_at' => seeders_at('2021-07-01 15:54:28'), 'updated_at' => seeders_at('2021-07-01 15:54:28'),
@ -450,7 +450,7 @@ curl -O https://task.hitosea.com/uploads/files/3/202105/ba786dfc2f4c2fe916880474
   
', ',
'size' => 64704, 'size' => 8088,
'userid' => 1, 'userid' => 1,
'created_at' => seeders_at('2021-07-01 15:57:08'), 'created_at' => seeders_at('2021-07-01 15:57:08'),
'updated_at' => seeders_at('2021-07-01 15:57:08'), 'updated_at' => seeders_at('2021-07-01 15:57:08'),
@ -580,7 +580,7 @@ curl -O https://task.hitosea.com/uploads/files/3/202105/ba786dfc2f4c2fe916880474
   
   
', ',
'size' => 186128, 'size' => 23266,
'userid' => 1, 'userid' => 1,
'created_at' => seeders_at('2021-07-01 15:57:56'), 'created_at' => seeders_at('2021-07-01 15:57:56'),
'updated_at' => seeders_at('2021-07-01 15:57:56'), 'updated_at' => seeders_at('2021-07-01 15:57:56'),
@ -592,7 +592,7 @@ curl -O https://task.hitosea.com/uploads/files/3/202105/ba786dfc2f4c2fe916880474
'content' => $this->getContent(15), 'content' => $this->getContent(15),
'fid' => 10, 'fid' => 10,
'text' => '', 'text' => '',
'size' => 15070072, 'size' => 1883759,
'userid' => 1, 'userid' => 1,
'created_at' => seeders_at('2021-07-01 15:59:05'), 'created_at' => seeders_at('2021-07-01 15:59:05'),
'updated_at' => seeders_at('2021-07-01 15:59:05'), 'updated_at' => seeders_at('2021-07-01 15:59:05'),
@ -604,7 +604,7 @@ curl -O https://task.hitosea.com/uploads/files/3/202105/ba786dfc2f4c2fe916880474
'content' => $this->getContent(17), 'content' => $this->getContent(17),
'fid' => 11, 'fid' => 11,
'text' => '', 'text' => '',
'size' => 14170904, 'size' => 1771363,
'userid' => 1, 'userid' => 1,
'created_at' => seeders_at('2021-07-01 16:00:28'), 'created_at' => seeders_at('2021-07-01 16:00:28'),
'updated_at' => seeders_at('2021-07-01 16:00:28'), 'updated_at' => seeders_at('2021-07-01 16:00:28'),
@ -616,7 +616,7 @@ curl -O https://task.hitosea.com/uploads/files/3/202105/ba786dfc2f4c2fe916880474
'content' => $this->getContent(19), 'content' => $this->getContent(19),
'fid' => 12, 'fid' => 12,
'text' => '', 'text' => '',
'size' => 43344, 'size' => 5418,
'userid' => 1, 'userid' => 1,
'created_at' => seeders_at('2021-07-01 16:03:06'), 'created_at' => seeders_at('2021-07-01 16:03:06'),
'updated_at' => seeders_at('2021-07-01 16:03:06'), 'updated_at' => seeders_at('2021-07-01 16:03:06'),

View File

@ -41,7 +41,7 @@ class FilesTableSeeder extends Seeder
'cid' => 0, 'cid' => 0,
'name' => '如何搭建B端设计规范', 'name' => '如何搭建B端设计规范',
'type' => 'document', 'type' => 'document',
'size' => 135808, 'size' => 16976,
'userid' => 1, 'userid' => 1,
'created_at' => seeders_at('2021-07-01 14:03:37'), 'created_at' => seeders_at('2021-07-01 14:03:37'),
'updated_at' => seeders_at('2021-07-01 14:17:28'), 'updated_at' => seeders_at('2021-07-01 14:17:28'),
@ -54,7 +54,7 @@ class FilesTableSeeder extends Seeder
'cid' => 0, 'cid' => 0,
'name' => '页面设计中的信息组织策略探索-言之有序', 'name' => '页面设计中的信息组织策略探索-言之有序',
'type' => 'document', 'type' => 'document',
'size' => 95768, 'size' => 11971,
'userid' => 1, 'userid' => 1,
'created_at' => seeders_at('2021-07-01 15:46:59'), 'created_at' => seeders_at('2021-07-01 15:46:59'),
'updated_at' => seeders_at('2021-07-01 15:49:14'), 'updated_at' => seeders_at('2021-07-01 15:49:14'),
@ -80,7 +80,7 @@ class FilesTableSeeder extends Seeder
'cid' => 0, 'cid' => 0,
'name' => '配置静态IP地址', 'name' => '配置静态IP地址',
'type' => 'document', 'type' => 'document',
'size' => 2280, 'size' => 285,
'userid' => 1, 'userid' => 1,
'created_at' => seeders_at('2021-07-01 15:49:50'), 'created_at' => seeders_at('2021-07-01 15:49:50'),
'updated_at' => seeders_at('2021-07-01 15:53:09'), 'updated_at' => seeders_at('2021-07-01 15:53:09'),
@ -93,7 +93,7 @@ class FilesTableSeeder extends Seeder
'cid' => 0, 'cid' => 0,
'name' => '脑图', 'name' => '脑图',
'type' => 'mind', 'type' => 'mind',
'size' => 15576, 'size' => 1947,
'userid' => 1, 'userid' => 1,
'created_at' => seeders_at('2021-07-01 15:53:50'), 'created_at' => seeders_at('2021-07-01 15:53:50'),
'updated_at' => seeders_at('2021-07-01 16:11:39'), 'updated_at' => seeders_at('2021-07-01 16:11:39'),
@ -119,7 +119,7 @@ class FilesTableSeeder extends Seeder
'cid' => 0, 'cid' => 0,
'name' => '会议纪要', 'name' => '会议纪要',
'type' => 'document', 'type' => 'document',
'size' => 64704, 'size' => 8088,
'userid' => 1, 'userid' => 1,
'created_at' => seeders_at('2021-07-01 15:56:09'), 'created_at' => seeders_at('2021-07-01 15:56:09'),
'updated_at' => seeders_at('2021-07-01 16:11:13'), 'updated_at' => seeders_at('2021-07-01 16:11:13'),
@ -132,7 +132,7 @@ class FilesTableSeeder extends Seeder
'cid' => 0, 'cid' => 0,
'name' => '部门周报', 'name' => '部门周报',
'type' => 'document', 'type' => 'document',
'size' => 186128, 'size' => 23266,
'userid' => 1, 'userid' => 1,
'created_at' => seeders_at('2021-07-01 15:57:39'), 'created_at' => seeders_at('2021-07-01 15:57:39'),
'updated_at' => seeders_at('2021-07-01 15:57:56'), 'updated_at' => seeders_at('2021-07-01 15:57:56'),
@ -145,7 +145,7 @@ class FilesTableSeeder extends Seeder
'cid' => 0, 'cid' => 0,
'name' => '项目管理', 'name' => '项目管理',
'type' => 'sheet', 'type' => 'sheet',
'size' => 15070072, 'size' => 1883759,
'userid' => 1, 'userid' => 1,
'created_at' => seeders_at('2021-07-01 15:58:30'), 'created_at' => seeders_at('2021-07-01 15:58:30'),
'updated_at' => seeders_at('2021-07-01 16:10:17'), 'updated_at' => seeders_at('2021-07-01 16:10:17'),
@ -158,7 +158,7 @@ class FilesTableSeeder extends Seeder
'cid' => 0, 'cid' => 0,
'name' => '工作计划', 'name' => '工作计划',
'type' => 'sheet', 'type' => 'sheet',
'size' => 14170904, 'size' => 1771363,
'userid' => 1, 'userid' => 1,
'created_at' => seeders_at('2021-07-01 15:59:59'), 'created_at' => seeders_at('2021-07-01 15:59:59'),
'updated_at' => seeders_at('2021-07-01 16:00:28'), 'updated_at' => seeders_at('2021-07-01 16:00:28'),
@ -171,7 +171,7 @@ class FilesTableSeeder extends Seeder
'cid' => 0, 'cid' => 0,
'name' => '流程图', 'name' => '流程图',
'type' => 'flow', 'type' => 'flow',
'size' => 43344, 'size' => 5418,
'userid' => 1, 'userid' => 1,
'created_at' => seeders_at('2021-07-01 16:01:27'), 'created_at' => seeders_at('2021-07-01 16:01:27'),
'updated_at' => seeders_at('2021-07-01 16:03:06'), 'updated_at' => seeders_at('2021-07-01 16:03:06'),

View File

@ -49,6 +49,7 @@
<Flow v-else-if="file.type=='flow'" ref="myFlow" v-model="contentDetail" @saveData="handleClick('saveBefore')"/> <Flow v-else-if="file.type=='flow'" ref="myFlow" v-model="contentDetail" @saveData="handleClick('saveBefore')"/>
<Minder v-else-if="file.type=='mind'" ref="myMind" v-model="contentDetail" @saveData="handleClick('saveBefore')"/> <Minder v-else-if="file.type=='mind'" ref="myMind" v-model="contentDetail" @saveData="handleClick('saveBefore')"/>
<LuckySheet v-else-if="file.type=='sheet'" ref="mySheet" v-model="contentDetail"/> <LuckySheet v-else-if="file.type=='sheet'" ref="mySheet" v-model="contentDetail"/>
<div v-if="loadContent > 0" class="content-load"><Loading/></div>
</div> </div>
</div> </div>
</template> </template>
@ -82,6 +83,7 @@ export default {
data() { data() {
return { return {
loadContent: 0,
loadIng: 0, loadIng: 0,
fileId: 0, fileId: 0,
@ -131,6 +133,7 @@ export default {
return; return;
} }
this.loadIng++; this.loadIng++;
this.loadContent++;
this.$store.dispatch("call", { this.$store.dispatch("call", {
url: 'file/content', url: 'file/content',
data: { data: {
@ -138,11 +141,13 @@ export default {
}, },
}).then(({data}) => { }).then(({data}) => {
this.loadIng--; this.loadIng--;
this.loadContent--;
this.contentDetail = data.content; this.contentDetail = data.content;
this.updateBak(); this.updateBak();
}).catch(({msg}) => { }).catch(({msg}) => {
$A.modalError(msg); $A.modalError(msg);
this.loadIng--; this.loadIng--;
this.loadContent--;
}) })
}, },

View File

@ -7,7 +7,7 @@
<h1>{{$L('文件')}}</h1> <h1>{{$L('文件')}}</h1>
</div> </div>
<div :class="['file-search', searchKey ? 'has-value' : '']"> <div :class="['file-search', searchKey ? 'has-value' : '']">
<Input v-model="searchKey" suffix="ios-search" :placeholder="$L('搜索名称')"/> <Input v-model="searchKey" suffix="ios-search" @on-change="onSearchChange" :placeholder="$L('搜索名称')"/>
</div> </div>
<div class="file-add"> <div class="file-add">
<EDropdown <EDropdown
@ -29,6 +29,7 @@
<li v-if="searchKey">{{$L('搜索')}} "{{searchKey}}"</li> <li v-if="searchKey">{{$L('搜索')}} "{{searchKey}}"</li>
<li v-else v-for="item in navigator" @click="pid=item.id"><span :title="item.name">{{item.name}}</span></li> <li v-else v-for="item in navigator" @click="pid=item.id"><span :title="item.name">{{item.name}}</span></li>
</ul> </ul>
<div v-if="loadIng > 0" class="nav-load"><Loading/></div>
<Button v-if="shearFile && shearFile.pid != pid" size="small" type="primary" @click="shearTo"> <Button v-if="shearFile && shearFile.pid != pid" size="small" type="primary" @click="shearTo">
<div class="file-shear"> <div class="file-shear">
<span>{{$L('粘贴')}}</span> <span>{{$L('粘贴')}}</span>
@ -115,6 +116,7 @@ export default {
return { return {
loadIng: 0, loadIng: 0,
searchKey: '', searchKey: '',
searchTimeout: null,
pid: this.$store.state.method.getStorageInt("fileOpenPid"), pid: this.$store.state.method.getStorageInt("fileOpenPid"),
shearId: 0, shearId: 0,
@ -189,7 +191,9 @@ export default {
pid: { pid: {
handler() { handler() {
this.loadIng++; this.loadIng++;
this.$store.dispatch("getFiles", this.pid).then(() => { this.$store.dispatch("getFiles", {
pid: this.pid
}).then(() => {
this.loadIng--; this.loadIng--;
this.$store.state.method.setStorage("fileOpenPid", this.pid) this.$store.state.method.setStorage("fileOpenPid", this.pid)
}).catch(({msg}) => { }).catch(({msg}) => {
@ -492,6 +496,22 @@ export default {
this.$store.dispatch("forgetFile", item.id); this.$store.dispatch("forgetFile", item.id);
} }
}) })
},
onSearchChange() {
clearTimeout(this.searchTimeout);
if (this.searchKey.trim() != '') {
this.searchTimeout = setTimeout(() => {
this.loadIng++;
this.$store.dispatch("getFiles", {
key: this.searchKey,
}).then(() => {
this.loadIng--;
}).catch(() => {
this.loadIng--;
});
}, 600)
}
} }
} }
} }

View File

@ -13,7 +13,10 @@
v-for="(item, key) in dialogType" v-for="(item, key) in dialogType"
:key="key" :key="key"
:class="{active:dialogActive==item.type}" :class="{active:dialogActive==item.type}"
@click="dialogActive=item.type">{{$L(item.name)}}</p> @click="dialogActive=item.type">
<Badge class="nav-num" :count="msgUnread(item.type)"/>
{{$L(item.name)}}
</p>
</div> </div>
<div ref="list" class="messenger-list overlay-y"> <div ref="list" class="messenger-list overlay-y">
<ul v-if="tabActive==='dialog'" class="dialog"> <ul v-if="tabActive==='dialog'" class="dialog">
@ -138,6 +141,31 @@ export default {
return true; return true;
}) })
}, },
msgUnread() {
return function (type) {
let num = 0;
this.dialogs.map((dialog) => {
switch (type) {
case 'project':
case 'task':
if (type == dialog.group_type) {
num += dialog.unread;
}
break;
case 'user':
if (type == dialog.type) {
num += dialog.unread;
}
break;
default:
num += dialog.unread;
break;
}
});
return num;
}
},
}, },
watch: { watch: {

View File

@ -318,19 +318,17 @@ export default {
* 获取文件 * 获取文件
* @param state * @param state
* @param dispatch * @param dispatch
* @param pid * @param data {?pid, ?key}
* @returns {Promise<unknown>} * @returns {Promise<unknown>}
*/ */
getFiles({state, dispatch}, pid) { getFiles({state, dispatch}, data) {
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
dispatch("call", { dispatch("call", {
url: 'file/lists', url: 'file/lists',
data: { data,
pid,
},
}).then((result) => { }).then((result) => {
const ids = result.data.map(({id}) => id) const ids = result.data.map(({id}) => id)
state.files = state.files.filter((item) => item.pid != pid || ids.includes(item.id)); state.files = state.files.filter((item) => item.pid != data.pid || ids.includes(item.id));
dispatch("saveFile", result.data); dispatch("saveFile", result.data);
resolve(result) resolve(result)
}).catch(e => { }).catch(e => {

View File

@ -22,6 +22,7 @@
min-height: 22px; min-height: 22px;
.icon-inline { .icon-inline {
color: #bbbbbb;
position: absolute; position: absolute;
left: 0; left: 0;
top: 0; top: 0;

View File

@ -149,6 +149,21 @@
.luckysheet { .luckysheet {
border: 0; border: 0;
} }
.content-load {
display: flex;
align-items: center;
justify-content: center;
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 1000;
.common-loading {
margin: 0;
}
}
} }
} }
.luckysheet-input-box { .luckysheet-input-box {

View File

@ -102,6 +102,18 @@
} }
} }
} }
.nav-load {
margin-left: 4px;
width: 24px;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
.common-loading {
width: 12px;
height: 12px;
}
}
.ivu-btn { .ivu-btn {
font-size: 12px; font-size: 12px;
margin-left: 12px; margin-left: 12px;

View File

@ -49,13 +49,20 @@
.messenger-nav { .messenger-nav {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: space-evenly;
padding: 2px 0 12px; padding: 2px 0 12px;
> p { > p {
position: relative;
line-height: 1; line-height: 1;
padding: 0 16px; padding: 0 6px;
color: #888888; color: #888888;
cursor: pointer; cursor: pointer;
.nav-num {
position: absolute;
top: -12px;
right: -8px;
transform: scale(0.7);
}
&.active { &.active {
color: #555555; color: #555555;
font-weight: 500; font-weight: 500;
@ -154,7 +161,6 @@
position: absolute; position: absolute;
top: 10px; top: 10px;
left: 42px; left: 42px;
font-size: 12px;
transform: scale(0.8); transform: scale(0.8);
} }
&.active { &.active {