1
0
mirror of https://gitee.com/koogua/course-tencent-cloud.git synced 2025-07-03 15:36:48 +08:00

去除了im里面的查找,后台增加im配置项,缓存归类

This commit is contained in:
xiaochong0302 2020-08-17 21:01:51 +08:00
parent 9f5b48c307
commit e40e3d9faf
73 changed files with 393 additions and 524 deletions

View File

@ -18,7 +18,7 @@ class IndexCarouselList extends Cache
public function getKey($id = null) public function getKey($id = null)
{ {
return 'index_carousel_list'; return 'index:carousel_list';
} }
public function getContent($id = null) public function getContent($id = null)

View File

@ -23,7 +23,7 @@ class IndexFreeCourseList extends Cache
public function getKey($id = null) public function getKey($id = null)
{ {
return 'index_free_course_list'; return 'index:free_course_list';
} }
public function getContent($id = null) public function getContent($id = null)

View File

@ -22,7 +22,7 @@ class IndexLiveList extends Cache
public function getKey($id = null) public function getKey($id = null)
{ {
return 'index_live_list'; return 'index:live_list';
} }
public function getContent($id = null) public function getContent($id = null)

View File

@ -23,7 +23,7 @@ class IndexNewCourseList extends Cache
public function getKey($id = null) public function getKey($id = null)
{ {
return 'index_new_course_list'; return 'index:new_course_list';
} }
public function getContent($id = null) public function getContent($id = null)

View File

@ -23,7 +23,7 @@ class IndexVipCourseList extends Cache
public function getKey($id = null) public function getKey($id = null)
{ {
return 'index_vip_course_list'; return 'index:vip_course_list';
} }
public function getContent($id = null) public function getContent($id = null)

View File

@ -16,7 +16,7 @@ class MaxCategoryId extends Cache
public function getKey($id = null) public function getKey($id = null)
{ {
return 'max_category_id'; return 'max_id:category';
} }
public function getContent($id = null) public function getContent($id = null)

View File

@ -16,7 +16,7 @@ class MaxChapterId extends Cache
public function getKey($id = null) public function getKey($id = null)
{ {
return 'max_chapter_id'; return 'max_id:chapter';
} }
public function getContent($id = null) public function getContent($id = null)

View File

@ -16,7 +16,7 @@ class MaxCourseId extends Cache
public function getKey($id = null) public function getKey($id = null)
{ {
return 'max_course_id'; return 'max_id:course';
} }
public function getContent($id = null) public function getContent($id = null)

View File

@ -16,7 +16,7 @@ class MaxHelpId extends Cache
public function getKey($id = null) public function getKey($id = null)
{ {
return 'max_help_id'; return 'max_id:help';
} }
public function getContent($id = null) public function getContent($id = null)

View File

@ -16,7 +16,7 @@ class MaxImGroupId extends Cache
public function getKey($id = null) public function getKey($id = null)
{ {
return 'max_im_group_id'; return 'max_id:im_group';
} }
public function getContent($id = null) public function getContent($id = null)

View File

@ -16,7 +16,7 @@ class MaxPackageId extends Cache
public function getKey($id = null) public function getKey($id = null)
{ {
return 'max_package_id'; return 'max_id:package';
} }
public function getContent($id = null) public function getContent($id = null)

View File

@ -16,7 +16,7 @@ class MaxPageId extends Cache
public function getKey($id = null) public function getKey($id = null)
{ {
return 'max_page_id'; return 'max_id:page';
} }
public function getContent($id = null) public function getContent($id = null)

View File

@ -16,7 +16,7 @@ class MaxTopicId extends Cache
public function getKey($id = null) public function getKey($id = null)
{ {
return 'max_topic_id'; return 'max_id:topic';
} }
public function getContent($id = null) public function getContent($id = null)

View File

@ -16,7 +16,7 @@ class MaxUserId extends Cache
public function getKey($id = null) public function getKey($id = null)
{ {
return 'max_user_id'; return 'max_id:user';
} }
public function getContent($id = null) public function getContent($id = null)

View File

@ -11,7 +11,7 @@ class ImGroupController extends Controller
{ {
/** /**
* @Get("/list", name="admin.im_group.list") * @Get("/list", name="admin.group.list")
*/ */
public function listAction() public function listAction()
{ {
@ -19,27 +19,43 @@ class ImGroupController extends Controller
$pager = $groupService->getGroups(); $pager = $groupService->getGroups();
$this->view->pick('im/group/list');
$this->view->setVar('pager', $pager); $this->view->setVar('pager', $pager);
} }
/** /**
* @Get("/search", name="admin.im_group.search") * @Get("/search", name="admin.group.search")
*/ */
public function searchAction() public function searchAction()
{ {
$this->view->pick('im/group/search');
} }
/** /**
* @Get("/add", name="admin.im_group.add") * @Get("/add", name="admin.group.add")
*/ */
public function addAction() public function addAction()
{ {
$this->view->pick('im/group/add');
} }
/** /**
* @Post("/create", name="admin.im_group.create") * @Get("/{id:[0-9]+}/edit", name="admin.group.edit")
*/
public function editAction($id)
{
$groupService = new ImGroupService();
$group = $groupService->getGroup($id);
$this->view->pick('im/group/edit');
$this->view->setVar('group', $group);
}
/**
* @Post("/create", name="admin.group.create")
*/ */
public function createAction() public function createAction()
{ {
@ -48,7 +64,7 @@ class ImGroupController extends Controller
$group = $groupService->createGroup(); $group = $groupService->createGroup();
$location = $this->url->get([ $location = $this->url->get([
'for' => 'admin.im_group.edit', 'for' => 'admin.group.edit',
'id' => $group->id, 'id' => $group->id,
]); ]);
@ -61,19 +77,7 @@ class ImGroupController extends Controller
} }
/** /**
* @Get("/{id:[0-9]+}/edit", name="admin.im_group.edit") * @Post("/{id:[0-9]+}/update", name="admin.group.update")
*/
public function editAction($id)
{
$groupService = new ImGroupService();
$group = $groupService->getGroup($id);
$this->view->setVar('group', $group);
}
/**
* @Post("/{id:[0-9]+}/update", name="admin.im_group.update")
*/ */
public function updateAction($id) public function updateAction($id)
{ {
@ -81,7 +85,7 @@ class ImGroupController extends Controller
$groupService->updateGroup($id); $groupService->updateGroup($id);
$location = $this->url->get(['for' => 'admin.im_group.list']); $location = $this->url->get(['for' => 'admin.group.list']);
$content = [ $content = [
'location' => $location, 'location' => $location,
@ -92,7 +96,7 @@ class ImGroupController extends Controller
} }
/** /**
* @Post("/{id:[0-9]+}/delete", name="admin.im_group.delete") * @Post("/{id:[0-9]+}/delete", name="admin.group.delete")
*/ */
public function deleteAction($id) public function deleteAction($id)
{ {
@ -111,7 +115,7 @@ class ImGroupController extends Controller
} }
/** /**
* @Post("/{id:[0-9]+}/restore", name="admin.im_group.restore") * @Post("/{id:[0-9]+}/restore", name="admin.group.restore")
*/ */
public function restoreAction($id) public function restoreAction($id)
{ {

View File

@ -278,4 +278,34 @@ class SettingController extends Controller
} }
} }
/**
* @Route("/im", name="admin.setting.im")
*/
public function imAction()
{
$section = 'im';
$settingService = new SettingService();
if ($this->request->isPost()) {
$data = $this->request->getPost();
$settingService->updateSectionSettings($section, $data);
$content = [
'location' => $this->request->getHTTPReferer(),
'msg' => '更新配置成功',
];
return $this->jsonSuccess($content);
} else {
$im = $settingService->getSectionSettings($section);
$this->view->setVar('im', $im);
}
}
} }

View File

@ -348,31 +348,31 @@ class AuthNode extends Service
'id' => '2-4-1', 'id' => '2-4-1',
'title' => '群组列表', 'title' => '群组列表',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.im_group.list', 'route' => 'admin.group.list',
], ],
[ [
'id' => '2-4-2', 'id' => '2-4-2',
'title' => '搜索群组', 'title' => '搜索群组',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.im_group.search', 'route' => 'admin.group.search',
], ],
[ [
'id' => '2-4-3', 'id' => '2-4-3',
'title' => '添加群组', 'title' => '添加群组',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.im_group.add', 'route' => 'admin.group.add',
], ],
[ [
'id' => '2-4-4', 'id' => '2-4-4',
'title' => '编辑群组', 'title' => '编辑群组',
'type' => 'button', 'type' => 'button',
'route' => 'admin.im_group.edit', 'route' => 'admin.group.edit',
], ],
[ [
'id' => '2-4-5', 'id' => '2-4-5',
'title' => '删除群组', 'title' => '删除群组',
'type' => 'button', 'type' => 'button',
'route' => 'admin.im_group.delete', 'route' => 'admin.group.delete',
], ],
], ],
], ],
@ -700,7 +700,13 @@ class AuthNode extends Service
'title' => '会员设置', 'title' => '会员设置',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.setting.vip', 'route' => 'admin.setting.vip',
] ],
[
'id' => '5-1-11',
'title' => '微聊设置',
'type' => 'menu',
'route' => 'admin.setting.im',
],
], ],
], ],
], ],

View File

@ -190,8 +190,6 @@ class Course extends Service
$course->update($data); $course->update($data);
$this->updateCourseGroup($course);
return $course; return $course;
} }
@ -357,15 +355,6 @@ class Course extends Service
return $validator->checkCourse($id); return $validator->checkCourse($id);
} }
protected function updateCourseGroup(CourseModel $course)
{
$courseRepo = new CourseRepo();
$imGroup = $courseRepo->findImGroup($course->id);
$imGroup->update(['name' => $course->title]);
}
protected function rebuildCourseCache(CourseModel $course) protected function rebuildCourseCache(CourseModel $course)
{ {
$cache = new CourseCache(); $cache = new CourseCache();

View File

@ -2,7 +2,7 @@
{% block content %} {% block content %}
<form class="layui-form kg-form" method="POST" action="{{ url({'for':'admin.im_group.create'}) }}"> <form class="layui-form kg-form" method="POST" action="{{ url({'for':'admin.group.create'}) }}">
<fieldset class="layui-elem-field layui-field-title"> <fieldset class="layui-elem-field layui-field-title">
<legend>添加群组</legend> <legend>添加群组</legend>
</fieldset> </fieldset>
@ -23,6 +23,7 @@
<div class="layui-input-block"> <div class="layui-input-block">
<input type="radio" name="type" value="course" title="课程" disabled="disabled"> <input type="radio" name="type" value="course" title="课程" disabled="disabled">
<input type="radio" name="type" value="chat" title="聊天" checked="checked"> <input type="radio" name="type" value="chat" title="聊天" checked="checked">
<input type="radio" name="type" value="staff" title="员工">
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">

View File

@ -2,7 +2,7 @@
{% block content %} {% block content %}
<form class="layui-form kg-form" method="POST" action="{{ url({'for':'admin.im_group.update','id':group.id}) }}"> <form class="layui-form kg-form" method="POST" action="{{ url({'for':'admin.group.update','id':group.id}) }}">
<fieldset class="layui-elem-field layui-field-title"> <fieldset class="layui-elem-field layui-field-title">
<legend>编辑群组</legend> <legend>编辑群组</legend>
</fieldset> </fieldset>

View File

@ -47,10 +47,10 @@
</thead> </thead>
<tbody> <tbody>
{% for item in pager.items %} {% for item in pager.items %}
{% set edit_url = url({'for':'admin.im_group.edit','id':item.id}) %} {% set edit_url = url({'for':'admin.group.edit','id':item.id}) %}
{% set update_url = url({'for':'admin.im_group.update','id':item.id}) %} {% set update_url = url({'for':'admin.group.update','id':item.id}) %}
{% set delete_url = url({'for':'admin.im_group.delete','id':item.id}) %} {% set delete_url = url({'for':'admin.group.delete','id':item.id}) %}
{% set restore_url = url({'for':'admin.im_group.restore','id':item.id}) %} {% set restore_url = url({'for':'admin.group.restore','id':item.id}) %}
<tr> <tr>
<td>{{ item.id }}</td> <td>{{ item.id }}</td>
<td>{{ item.name }} {{ type_info(item.type) }}</td> <td>{{ item.name }} {{ type_info(item.type) }}</td>

View File

@ -2,7 +2,7 @@
{% block content %} {% block content %}
<form class="layui-form kg-form" method="GET" action="{{ url({'for':'admin.im_group.list'}) }}"> <form class="layui-form kg-form" method="GET" action="{{ url({'for':'admin.group.list'}) }}">
<fieldset class="layui-elem-field layui-field-title"> <fieldset class="layui-elem-field layui-field-title">
<legend>搜索群组</legend> <legend>搜索群组</legend>
</fieldset> </fieldset>

View File

@ -0,0 +1,42 @@
{% extends 'templates/main.volt' %}
{% block content %}
<form class="layui-form kg-form" method="POST" action="{{ url({'for':'admin.setting.im'}) }}">
<fieldset class="layui-elem-field layui-field-title">
<legend>微聊配置</legend>
</fieldset>
<div class="layui-form-item">
<label class="layui-form-label">应用名称</label>
<div class="layui-input-block">
<input class="layui-input" type="text" name="title" value="{{ im.title }}" layui-verify="required">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">客服1用户编号</label>
<div class="layui-input-block">
<input class="layui-input" type="text" name="cs_user1_id" value="{{ im.cs_user1_id }}" layui-verify="required">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">客服2用户编号</label>
<div class="layui-input-block">
<input class="layui-input" type="text" name="cs_user2_id" value="{{ im.cs_user2_id }}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">客服3用户编号</label>
<div class="layui-input-block">
<input class="layui-input" type="text" name="cs_user3_id" value="{{ im.cs_user3_id }}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<button class="layui-btn" lay-submit="true" lay-filter="go">提交</button>
<button type="button" class="kg-back layui-btn layui-btn-primary">返回</button>
</div>
</div>
</form>
{% endblock %}

View File

@ -2,7 +2,7 @@
{% block content %} {% block content %}
{% set closed_tips_display = site.status == 'normal' ? 'style="display:none;"' : '' %} {% set closed_tips_display = site.enabled == 1 ? 'style="display:none;"' : '' %}
<form class="layui-form kg-form" method="POST" action="{{ url({'for':'admin.setting.site'}) }}"> <form class="layui-form kg-form" method="POST" action="{{ url({'for':'admin.setting.site'}) }}">
<fieldset class="layui-elem-field layui-field-title"> <fieldset class="layui-elem-field layui-field-title">
@ -11,8 +11,8 @@
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">站点状态</label> <label class="layui-form-label">站点状态</label>
<div class="layui-input-block"> <div class="layui-input-block">
<input type="radio" name="status" value="normal" title="正常" lay-filter="status" {% if site.status == "normal" %}checked{% endif %}> <input type="radio" name="enabled" value="1" title="正常" lay-filter="status" {% if site.enabled == 1 %}checked{% endif %}>
<input type="radio" name="status" value="closed" title="关闭" lay-filter="status" {% if site.status == "closed" %}checked{% endif %}> <input type="radio" name="enabled" value="0" title="关闭" lay-filter="status" {% if site.enabled == 0 %}checked{% endif %}>
</div> </div>
</div> </div>
<div id="closed-tips-block" {{ closed_tips_display }}> <div id="closed-tips-block" {{ closed_tips_display }}>
@ -110,7 +110,7 @@
form.on('radio(status)', function (data) { form.on('radio(status)', function (data) {
var block = $('#closed-tips-block'); var block = $('#closed-tips-block');
if (data.value === 'closed') { if (data.value === '0') {
block.show(); block.show();
} else { } else {
block.hide(); block.hide();

View File

@ -20,11 +20,6 @@ class Controller extends \Phalcon\Mvc\Controller
*/ */
protected $seo; protected $seo;
/**
* @var array
*/
protected $site;
/** /**
* @var array * @var array
*/ */
@ -35,6 +30,11 @@ class Controller extends \Phalcon\Mvc\Controller
*/ */
protected $appInfo; protected $appInfo;
/**
* @var array
*/
protected $siteInfo;
/** /**
* @var UserModel * @var UserModel
*/ */
@ -45,7 +45,7 @@ class Controller extends \Phalcon\Mvc\Controller
public function beforeExecuteRoute(Dispatcher $dispatcher) public function beforeExecuteRoute(Dispatcher $dispatcher)
{ {
$this->site = $this->getSiteSettings(); $this->siteInfo = $this->getSiteInfo();
$this->checkSiteStatus(); $this->checkSiteStatus();
@ -66,12 +66,12 @@ class Controller extends \Phalcon\Mvc\Controller
$this->appInfo = $this->getAppInfo(); $this->appInfo = $this->getAppInfo();
$this->authUser = $this->getAuthUser(); $this->authUser = $this->getAuthUser();
$this->seo->setTitle($this->site['title']); $this->seo->setTitle($this->siteInfo['title']);
$this->view->setVar('site', $this->site);
$this->view->setVar('seo', $this->seo); $this->view->setVar('seo', $this->seo);
$this->view->setVar('navs', $this->navs); $this->view->setVar('navs', $this->navs);
$this->view->setVar('app_info', $this->appInfo); $this->view->setVar('app_info', $this->appInfo);
$this->view->setVar('site_info', $this->siteInfo);
$this->view->setVar('auth_user', $this->authUser); $this->view->setVar('auth_user', $this->authUser);
$this->view->setVar('socket_url', $this->getSocketUrl()); $this->view->setVar('socket_url', $this->getSocketUrl());
} }
@ -98,7 +98,7 @@ class Controller extends \Phalcon\Mvc\Controller
return $cache->get() ?: []; return $cache->get() ?: [];
} }
protected function getSiteSettings() protected function getSiteInfo()
{ {
$cache = new SettingCache(); $cache = new SettingCache();
@ -119,11 +119,11 @@ class Controller extends \Phalcon\Mvc\Controller
protected function checkSiteStatus() protected function checkSiteStatus()
{ {
if ($this->site['status'] == 'closed') { if ($this->siteInfo['enabled'] == 0) {
$this->dispatcher->forward([ $this->dispatcher->forward([
'controller' => 'error', 'controller' => 'error',
'action' => 'shutdown', 'action' => 'shutdown',
'params' => ['message' => $this->site['closed_tips']], 'params' => ['message' => $this->siteInfo['closed_tips']],
]); ]);
} }
} }

View File

@ -9,11 +9,39 @@ use Phalcon\Mvc\View;
/** /**
* @RoutePrefix("/im") * @RoutePrefix("/im")
*/ */
class ImController extends LayerController class ImController extends Controller
{ {
use ResponseTrait; use ResponseTrait;
/**
* @Get("/", name="web.im.index")
*/
public function indexAction()
{
}
/**
* @Get("/cs", name="web.im.cs")
*/
public function csAction()
{
/**
* @todo 在线客服
*/
}
/**
* @Get("/robot", name="web.im.robot")
*/
public function robotAction()
{
/**
* @todo 聊天机器人
*/
}
/** /**
* @Get("/init", name="web.im.init") * @Get("/init", name="web.im.init")
*/ */
@ -68,7 +96,7 @@ class ImController extends LayerController
/** /**
* @Get("/friend/msg/unread", name="web.im.unread_friend_msg") * @Get("/friend/msg/unread", name="web.im.unread_friend_msg")
*/ */
public function unreadFriendMsgAction() public function unreadFriendMessageAction()
{ {
$service = new ImService(); $service = new ImService();
@ -78,9 +106,9 @@ class ImController extends LayerController
} }
/** /**
* @Get("/sys/msg/unread", name="web.im.unread_sys_msg") * @Get("/notice/unread", name="web.im.unread_notice")
*/ */
public function unreadSysMsgAction() public function unreadNoticeAction()
{ {
$service = new ImService(); $service = new ImService();
@ -90,24 +118,21 @@ class ImController extends LayerController
} }
/** /**
* @Get("/sys/msg", name="web.im.sys_msg") * @Get("/notice", name="web.im.notice")
*/ */
public function sysMsgAction() public function noticeAction()
{ {
$service = new ImService(); $service = new ImService();
$pager = $service->getNotices(); $pager = $service->getNotices();
$pager->items = kg_array_object($pager->items);
$this->view->pick('im/sys_msg');
$this->view->setVar('pager', $pager); $this->view->setVar('pager', $pager);
} }
/** /**
* @Post("/sys/msg/read", name="web.im.read_sys_msg") * @Post("/notice/read", name="web.im.read_notice")
*/ */
public function readSysMsgAction() public function readNoticeAction()
{ {
$service = new ImService(); $service = new ImService();
@ -140,51 +165,6 @@ class ImController extends LayerController
return $this->jsonPaginate($pager); return $this->jsonPaginate($pager);
} }
/**
* @Get("/find", name="web.im.find")
*/
public function findAction()
{
$service = new ImService();
$userPager = $service->getNewUsers();
$groupPager = $service->getNewGroups();
$userPager->items = kg_array_object($userPager->items);
$groupPager->items = kg_array_object($groupPager->items);
$this->view->setVar('user_pager', $userPager);
$this->view->setVar('group_pager', $groupPager);
}
/**
* @Get("/search", name="web.im.search")
*/
public function searchAction()
{
$type = $this->request->getQuery('type');
$query = $this->request->getQuery('query');
$target = $this->request->getQuery('target');
$this->view->setRenderLevel(View::LEVEL_ACTION_VIEW);
$service = new ImService();
if ($type == 'user') {
$this->view->pick('im/find_users');
$target = $target ?: 'tab-users';
$pager = $service->searchUsers($query);
} else {
$this->view->pick('im/find_groups');
$target = $target ?: 'tab-groups';
$pager = $service->searchGroups($query);
}
$pager->target = $target;
$this->view->setVar('pager', $pager);
}
/** /**
* @Post("/user/bind", name="web.im.bind_user") * @Post("/user/bind", name="web.im.bind_user")
*/ */

View File

@ -12,15 +12,17 @@ class ImGroupController extends Controller
{ {
/** /**
* @Get("/list", name="web.im_group.list") * @Get("/list", name="web.group.list")
*/ */
public function listAction() public function listAction()
{ {
$this->seo->prependTitle('群组'); $this->seo->prependTitle('群组');
$this->view->pick('im/group/list');
} }
/** /**
* @Get("/pager", name="web.im_group.pager") * @Get("/pager", name="web.group.pager")
*/ */
public function pagerAction() public function pagerAction()
{ {
@ -31,12 +33,12 @@ class ImGroupController extends Controller
$pager->target = 'group-list'; $pager->target = 'group-list';
$this->view->setRenderLevel(View::LEVEL_ACTION_VIEW); $this->view->setRenderLevel(View::LEVEL_ACTION_VIEW);
$this->view->pick('im_group/pager'); $this->view->pick('im/group/pager');
$this->view->setVar('pager', $pager); $this->view->setVar('pager', $pager);
} }
/** /**
* @Get("/{id:[0-9]+}", name="web.im_group.show") * @Get("/{id:[0-9]+}", name="web.group.show")
*/ */
public function showAction($id) public function showAction($id)
{ {
@ -44,11 +46,12 @@ class ImGroupController extends Controller
$group = $service->getGroup($id); $group = $service->getGroup($id);
$this->view->pick('im/group/show');
$this->view->setVar('group', $group); $this->view->setVar('group', $group);
} }
/** /**
* @Get("/{id:[0-9]+}/users", name="web.im_group.users") * @Get("/{id:[0-9]+}/users", name="web.group.users")
*/ */
public function usersAction($id) public function usersAction($id)
{ {
@ -59,11 +62,12 @@ class ImGroupController extends Controller
$pager->target = 'user-list'; $pager->target = 'user-list';
$this->view->setRenderLevel(View::LEVEL_ACTION_VIEW); $this->view->setRenderLevel(View::LEVEL_ACTION_VIEW);
$this->view->pick('im/group/users');
$this->view->setVar('pager', $pager); $this->view->setVar('pager', $pager);
} }
/** /**
* @Get("/{id:[0-9]+}/users/active", name="web.im_group.active_users") * @Get("/{id:[0-9]+}/users/active", name="web.group.active_users")
*/ */
public function activeUsersAction($id) public function activeUsersAction($id)
{ {
@ -72,7 +76,7 @@ class ImGroupController extends Controller
$users = $service->getActiveGroupUsers($id); $users = $service->getActiveGroupUsers($id);
$this->view->setRenderLevel(View::LEVEL_ACTION_VIEW); $this->view->setRenderLevel(View::LEVEL_ACTION_VIEW);
$this->view->pick('im_group/active_users'); $this->view->pick('im/group/active_users');
$this->view->setVar('users', $users); $this->view->setVar('users', $users);
} }

View File

@ -21,8 +21,7 @@ class ImGroupManageController extends Controller
$pager = $service->getGroupUsers($id); $pager = $service->getGroupUsers($id);
$pager->items = kg_array_object($pager->items); $this->view->pick('im/group/manage/users');
$this->view->setVar('group', $group); $this->view->setVar('group', $group);
$this->view->setVar('pager', $pager); $this->view->setVar('pager', $pager);
} }
@ -36,6 +35,7 @@ class ImGroupManageController extends Controller
$group = $service->getGroup($id); $group = $service->getGroup($id);
$this->view->pick('im/group/manage/edit');
$this->view->setVar('group', $group); $this->view->setVar('group', $group);
} }

View File

@ -2,9 +2,6 @@
namespace App\Http\Web\Controllers; namespace App\Http\Web\Controllers;
use App\Http\Web\Services\ImGroup as ImGroupService;
use Phalcon\Mvc\View;
/** /**
* @RoutePrefix("/im") * @RoutePrefix("/im")
*/ */
@ -35,20 +32,4 @@ class ImSummaryController extends Controller
$this->seo->prependTitle('群组'); $this->seo->prependTitle('群组');
} }
/**
* @Get("/pager", name="web.im_group.pager")
*/
public function pagerAction()
{
$service = new ImGroupService();
$pager = $service->getGroups();
$pager->target = 'group-list';
$this->view->setRenderLevel(View::LEVEL_ACTION_VIEW);
$this->view->pick('im_group/pager');
$this->view->setVar('pager', $pager);
}
} }

View File

@ -12,8 +12,8 @@ class IndexController extends Controller
*/ */
public function indexAction() public function indexAction()
{ {
$this->seo->setKeywords($this->site['keywords']); $this->seo->setKeywords($this->siteInfo['keywords']);
$this->seo->setDescription($this->site['description']); $this->seo->setDescription($this->siteInfo['description']);
$indexService = new IndexService(); $indexService = new IndexService();
@ -24,19 +24,4 @@ class IndexController extends Controller
$this->view->setVar('vip_courses', $indexService->getVipCourses()); $this->view->setVar('vip_courses', $indexService->getVipCourses());
} }
/**
* @Get("/im", name="web.im")
*/
public function imAction()
{
}
protected function getSocketUrl()
{
$config = $this->getDI()->get('config');
return $config->websocket->url;
}
} }

View File

@ -146,24 +146,22 @@ class MyController extends Controller
} }
/** /**
* @Get("/im/friends", name="web.my.im_friends") * @Get("/friends", name="web.my.friends")
*/ */
public function imFriendsAction() public function friendsAction()
{ {
$service = new MyFriendListService(); $service = new MyFriendListService();
$pager = $service->handle(); $pager = $service->handle();
$pager->items = kg_array_object($pager->items); $this->view->pick('my/friends');
$this->view->pick('my/im_friends');
$this->view->setVar('pager', $pager); $this->view->setVar('pager', $pager);
} }
/** /**
* @Get("/im/groups", name="web.my.im_groups") * @Get("/groups", name="web.my.groups")
*/ */
public function imGroupsAction() public function groupsAction()
{ {
$type = $this->request->getQuery('type', 'trim', 'joined'); $type = $this->request->getQuery('type', 'trim', 'joined');
@ -171,9 +169,7 @@ class MyController extends Controller
$pager = $service->handle($type); $pager = $service->handle($type);
$pager->items = kg_array_object($pager->items); $this->view->pick('my/groups');
$this->view->pick('my/im_groups');
$this->view->setVar('type', $type); $this->view->setVar('type', $type);
$this->view->setVar('pager', $pager); $this->view->setVar('pager', $pager);
} }

View File

@ -3,8 +3,6 @@
namespace App\Http\Web\Services; namespace App\Http\Web\Services;
use App\Builders\ImMessageList as ImMessageListBuilder; use App\Builders\ImMessageList as ImMessageListBuilder;
use App\Caches\ImNewGroupList as ImNewGroupListCache;
use App\Caches\ImNewUserList as ImNewUserListCache;
use App\Library\Paginator\Query as PagerQuery; use App\Library\Paginator\Query as PagerQuery;
use App\Models\ImMessage as ImMessageModel; use App\Models\ImMessage as ImMessageModel;
use App\Models\ImUser as ImUserModel; use App\Models\ImUser as ImUserModel;
@ -13,7 +11,6 @@ use App\Repos\ImGroup as ImGroupRepo;
use App\Repos\ImMessage as ImMessageRepo; use App\Repos\ImMessage as ImMessageRepo;
use App\Repos\ImNotice as ImNoticeRepo; use App\Repos\ImNotice as ImNoticeRepo;
use App\Repos\ImUser as ImUserRepo; use App\Repos\ImUser as ImUserRepo;
use App\Repos\User as UserRepo;
use App\Validators\ImFriendUser as ImFriendUserValidator; use App\Validators\ImFriendUser as ImFriendUserValidator;
use App\Validators\ImGroup as ImGroupValidator; use App\Validators\ImGroup as ImGroupValidator;
use App\Validators\ImGroupUser as ImGroupUserValidator; use App\Validators\ImGroupUser as ImGroupUserValidator;
@ -21,11 +18,6 @@ use App\Validators\ImMessage as ImMessageValidator;
use App\Validators\ImUser as ImUserValidator; use App\Validators\ImUser as ImUserValidator;
use GatewayClient\Gateway; use GatewayClient\Gateway;
/**
* 警告:
* 对象有更新操作会导致afterFetch()中的设置失效,
* 有相关依赖的要重新调用一次afterFetch()
*/
class Im extends Service class Im extends Service
{ {
@ -56,74 +48,6 @@ class Im extends Service
]; ];
} }
public function searchUsers($name)
{
$pagerQuery = new PagerQuery();
$params = $pagerQuery->getParams();
$params['name'] = $name;
$sort = $pagerQuery->getSort();
$page = $pagerQuery->getPage();
$limit = $pagerQuery->getLimit();
$userRepo = new UserRepo();
$pager = $userRepo->paginate($params, $sort, $page, $limit);
return $this->handleUserPager($pager);
}
public function searchGroups($name)
{
$pagerQuery = new PagerQuery();
$params = $pagerQuery->getParams();
$params['name'] = $name;
$sort = $pagerQuery->getSort();
$page = $pagerQuery->getPage();
$limit = $pagerQuery->getLimit();
$groupRepo = new ImGroupRepo();
$pager = $groupRepo->paginate($params, $sort, $page, $limit);
return $this->handleGroupPager($pager);
}
public function getNewUsers()
{
$cache = new ImNewUserListCache();
$items = $cache->get();
$pager = new \stdClass();
$pager->total_items = count($items);
$pager->total_pages = 1;
$pager->items = $items;
return $pager;
}
public function getNewGroups()
{
$cache = new ImNewGroupListCache();
$items = $cache->get();
$pager = new \stdClass();
$pager->total_items = count($items);
$pager->total_pages = 1;
$pager->items = $items;
return $pager;
}
public function getGroupUsers() public function getGroupUsers()
{ {
$id = $this->request->getQuery('id'); $id = $this->request->getQuery('id');
@ -648,62 +572,6 @@ class Im extends Service
return $pager; return $pager;
} }
protected function handleUserPager($pager)
{
if ($pager->total_items == 0) {
return $pager;
}
$users = $pager->items->toArray();
$baseUrl = kg_ci_base_url();
$items = [];
foreach ($users as $user) {
$user['avatar'] = $baseUrl . $user['avatar'];
$items[] = [
'id' => $user['id'],
'name' => $user['name'],
'avatar' => $user['avatar'],
'about' => $user['about'],
'vip' => $user['vip'],
];
}
$pager->items = $items;
return $pager;
}
protected function handleGroupPager($pager)
{
if ($pager->total_items == 0) {
return $pager;
}
$groups = $pager->items->toArray();
$baseUrl = kg_ci_base_url();
$items = [];
foreach ($groups as $group) {
$group['avatar'] = $baseUrl . $group['avatar'];
$items[] = [
'id' => $group['id'],
'type' => $group['type'],
'name' => $group['name'],
'avatar' => $group['avatar'],
'about' => $group['about'],
];
}
$pager->items = $items;
return $pager;
}
protected function getImUser($id) protected function getImUser($id)
{ {
$repo = new ImUserRepo(); $repo = new ImUserRepo();

View File

@ -1,35 +0,0 @@
{% extends 'templates/layer.volt' %}
{% block content %}
<div class="im-search-wrap">
<form class="layui-form im-search-form" method="get" action="{{ url({'for':'web.im.search'}) }}">
<input class="layui-input" type="text" name="query" placeholder="请输入关键字...">
<button class="layui-hide" type="submit" lay-submit="true" lay-filter="im_search">搜索</button>
</form>
<div class="im-search-tab">
<div class="layui-tab layui-tab-brief user-tab">
<ul class="layui-tab-title">
<li class="layui-this">成员</li>
<li>群组</li>
</ul>
<div class="layui-tab-content">
<div class="layui-tab-item layui-show" id="tab-users">
{{ partial('im/find_users',{'pager':user_pager}) }}
</div>
<div class="layui-tab-item" id="tab-groups">
{{ partial('im/find_groups',{'pager':group_pager}) }}
</div>
</div>
</div>
</div>
</div>
{% endblock %}
{% block include_js %}
{{ js_include('web/js/im.find.js') }}
{{ js_include('web/js/im.apply.js') }}
{% endblock %}

View File

@ -1,27 +0,0 @@
{% if pager.total_pages > 0 %}
<div class="im-user-list clearfix">
<div class="layui-row layui-col-space20">
{% for item in pager.items %}
<div class="layui-col-md2">
<div class="user-card">
{% if item.type == 'course' %}
<span class="layui-badge layui-bg-green type">课</span>
{% elseif item.type == 'chat' %}
<span class="layui-badge layui-bg-blue type">聊</span>
{% endif %}
<div class="avatar">
<a href="javascript:">
<img src="{{ item.avatar }}" alt="{{ item.name }}" title="{{ item.about }}">
</a>
</div>
<div class="name layui-elip" title="{{ item.name }}">{{ item.name }}</div>
<div class="action">
<span class="layui-badge-rim apply-group" data-id="{{ item.id }}" data-name="{{ item.name }}" data-avatar="{{ item.avatar }}">申请加入</span>
</div>
</div>
</div>
{% endfor %}
</div>
</div>
{{ partial('partials/pager_ajax') }}
{% endif %}

View File

@ -1,23 +0,0 @@
{% if pager.total_pages > 0 %}
<div class="im-user-list clearfix">
<div class="layui-row layui-col-space20">
{% for item in pager.items %}
<div class="layui-col-md2">
<div class="user-card">
{% if item.vip == 1 %}
<span class="layui-badge layui-bg-orange vip">VIP</span>
{% endif %}
<div class="avatar">
<a href="javascript:" title="{{ item.about|e }}"><img src="{{ item.avatar }}" alt="{{ item.name }}"></a>
</div>
<div class="name layui-elip" title="{{ item.name|e }}">{{ item.name }}</div>
<div class="action">
<span class="layui-badge-rim apply-friend" data-id="{{ item.id }}" data-name="{{ item.name }}" data-avatar="{{ item.avatar }}">申请好友</span>
</div>
</div>
</div>
{% endfor %}
</div>
</div>
{{ partial('partials/pager_ajax') }}
{% endif %}

View File

@ -2,7 +2,7 @@
{% block content %} {% block content %}
{% set pager_url = url({'for':'web.im_group.pager'}) %} {% set pager_url = url({'for':'web.group.pager'}) %}
<div class="layui-breadcrumb breadcrumb"> <div class="layui-breadcrumb breadcrumb">
<a href="/">首页</a> <a href="/">首页</a>
@ -15,6 +15,6 @@
{% block include_js %} {% block include_js %}
{{ js_include('web/js/im_group.list.js') }} {{ js_include('web/js/im.group.list.js') }}
{% endblock %} {% endblock %}

View File

@ -2,7 +2,7 @@
{% block content %} {% block content %}
{% set update_url = url({'for':'web.im_group.update','id':group.id}) %} {% set update_url = url({'for':'web.group.update','id':group.id}) %}
{% set name_readonly = group.type == 'course' ? 'readonly="readonly"' : '' %} {% set name_readonly = group.type == 'course' ? 'readonly="readonly"' : '' %}
<form class="layui-form" method="post" action="{{ update_url }}"> <form class="layui-form" method="post" action="{{ update_url }}">

View File

@ -6,7 +6,7 @@
<div class="im-user-list clearfix"> <div class="im-user-list clearfix">
<div class="layui-row layui-col-space20"> <div class="layui-row layui-col-space20">
{% for item in pager.items %} {% for item in pager.items %}
{% set delete_url = url({'for':'web.im_group.delete_user','gid':group.id,'uid':item.id}) %} {% set delete_url = url({'for':'web.igm.delete_user','gid':group.id,'uid':item.id}) %}
<div class="layui-col-md2"> <div class="layui-col-md2">
<div class="user-card"> <div class="user-card">
{% if item.vip == 1 %} {% if item.vip == 1 %}

View File

@ -1,8 +1,8 @@
{% if pager.total_pages > 0 %} {% if pager.total_pages > 0 %}
<div class="im-group-list clearfix"> <div class="group-list clearfix">
<div class="layui-row layui-col-space20"> <div class="layui-row layui-col-space20">
{% for item in pager.items %} {% for item in pager.items %}
{% set group_url = url({'for':'web.im_group.show','id':item.id}) %} {% set group_url = url({'for':'web.group.show','id':item.id}) %}
{% set owner_url = url({'for':'web.user.show','id':item.owner.id}) %} {% set owner_url = url({'for':'web.user.show','id':item.owner.id}) %}
{% set item.about = item.about ? item.about : '这家伙真懒,什么都没留下!' %} {% set item.about = item.about ? item.about : '这家伙真懒,什么都没留下!' %}
<div class="layui-col-md3"> <div class="layui-col-md3">

View File

@ -4,13 +4,13 @@
{% set group.about = group.about ? group.about : '这个家伙真懒,什么都没有留下~' %} {% set group.about = group.about ? group.about : '这个家伙真懒,什么都没有留下~' %}
{% set apply_group_url = '' %} {% set apply_group_url = '' %}
{% set users_url = url({'for':'web.im_group.users','id':group.id}) %} {% set users_url = url({'for':'web.group.users','id':group.id}) %}
{% set active_users_url = url({'for':'web.im_group.active_users','id':group.id}) %} {% set active_users_url = url({'for':'web.group.active_users','id':group.id}) %}
<div class="breadcrumb"> <div class="breadcrumb">
<span class="layui-breadcrumb"> <span class="layui-breadcrumb">
<a href="/">首页</a> <a href="/">首页</a>
<a href="{{ url({'for':'web.im_group.list'}) }}">群组</a> <a href="{{ url({'for':'web.group.list'}) }}">群组</a>
<a><cite>{{ group.name }}</cite></a> <a><cite>{{ group.name }}</cite></a>
</span> </span>
</div> </div>
@ -31,7 +31,7 @@
</div> </div>
<div class="layout-sidebar"> <div class="layout-sidebar">
<div class="sidebar"> <div class="sidebar">
{{ partial('im_group/show_owner') }} {{ partial('im/group/show_owner') }}
</div> </div>
<div class="sidebar wrap"> <div class="sidebar wrap">
<button class="layui-btn layui-btn-fluid apply-group" data-id="{{ group.id }}" data-name="{{ group.name }}" data-avatar="{{ group.avatar }}">加入群组</button> <button class="layui-btn layui-btn-fluid apply-group" data-id="{{ group.id }}" data-name="{{ group.name }}" data-avatar="{{ group.avatar }}">加入群组</button>
@ -44,7 +44,7 @@
{% block include_js %} {% block include_js %}
{{ js_include('web/js/im_group.show.js') }} {{ js_include('web/js/im.group.show.js') }}
{{ js_include('web/js/im.apply.js') }} {{ js_include('web/js/im.apply.js') }}
{% endblock %} {% endblock %}

View File

@ -25,9 +25,9 @@
</div> </div>
<div class="my-group-wrap wrap"> <div class="my-group-wrap wrap">
{% if type == 'owned' %} {% if type == 'owned' %}
{{ partial('my/im_groups_owned') }} {{ partial('my/groups_owned') }}
{% else %} {% else %}
{{ partial('my/im_groups_joined') }} {{ partial('my/groups_joined') }}
{% endif %} {% endif %}
</div> </div>
</div> </div>

View File

@ -40,8 +40,8 @@
<div class="layui-card-header">聊天设置</div> <div class="layui-card-header">聊天设置</div>
<div class="layui-card-body"> <div class="layui-card-body">
<ul class="my-menu"> <ul class="my-menu">
<li><a href="{{ url({'for':'web.my.im_friends'}) }}">我的好友</a></li> <li><a href="{{ url({'for':'web.my.friends'}) }}">我的好友</a></li>
<li><a href="{{ url({'for':'web.my.im_groups'}) }}">我的群组</a></li> <li><a href="{{ url({'for':'web.my.groups'}) }}">我的群组</a></li>
</ul> </ul>
</div> </div>
</div> </div>

View File

@ -6,15 +6,15 @@
{% endfor %} {% endfor %}
</div> </div>
<div class="copyright"> <div class="copyright">
{% if site.copyright %} {% if site_info.copyright %}
<span>&copy; {{ site.copyright }}</span> <span>&copy; {{ site_info.copyright }}</span>
{% endif %} {% endif %}
<a href="{{ app_info.link }}" title="{{ app_info.name }}">Powered by {{ app_info.alias }} {{ app_info.version }}</a> <a href="{{ app_info.link }}" title="{{ app_info.name }}">Powered by {{ app_info.alias }} {{ app_info.version }}</a>
{% if site.icp_sn %} {% if site_info.icp_sn %}
<a href="{{ site.icp_link }}">{{ site.icp_sn }}</a> <a href="{{ site_info.icp_link }}">{{ site_info.icp_sn }}</a>
{% endif %} {% endif %}
{% if site.police_sn %} {% if site_info.police_sn %}
<a href="{{ site.police_link }}">{{ site.police_sn }}</a> <a href="{{ site_info.police_link }}">{{ site_info.police_sn }}</a>
{% endif %} {% endif %}
</div> </div>
</div> </div>

View File

@ -9,7 +9,11 @@
vip: '{{ auth_user.vip }}' vip: '{{ auth_user.vip }}'
}, },
im: { im: {
socket_url: '{{ im.socket_url }}' title: '',
cs_user1_id: '',
cs_user2_id: '',
cs_user3_id: '',
socket_url: ''
} }
}; };

View File

@ -1,7 +1,7 @@
<div class="search-group-list"> <div class="search-group-list">
{% for item in pager.items %} {% for item in pager.items %}
{% set group_url = url({'for':'web.im_group.show','id':item.id}) %} {% set group_url = url({'for':'web.group.show','id':item.id}) %}
{% set owner_url = url({'for':'web.user.show','id':item.onwer.id}) %} {% set owner_url = url({'for':'web.user.show','id':item.owner.id}) %}
{% set item.about = item.about ? item.about : '这个家伙真懒,什么也没有留下!' %} {% set item.about = item.about ? item.about : '这个家伙真懒,什么也没有留下!' %}
<div class="search-group-card clearfix"> <div class="search-group-card clearfix">
<div class="avatar"> <div class="avatar">

View File

@ -29,15 +29,15 @@
{{ js_include('lib/layui/layui.js') }} {{ js_include('lib/layui/layui.js') }}
{{ js_include('web/js/common.js') }} {{ js_include('web/js/common.js') }}
{% if router.getActionName() != 'im' %} {% if router.getControllerName() != 'im' %}
{{ js_include('web/js/fixbar.js') }} {{ js_include('web/js/fixbar.js') }}
{% endif %} {% endif %}
{% block include_js %}{% endblock %} {% block include_js %}{% endblock %}
{% block inline_js %}{% endblock %} {% block inline_js %}{% endblock %}
{% if site.analytics %} {% if site_info.analytics %}
{{ site.analytics }} {{ site_info.analytics }}
{% endif %} {% endif %}
</body> </body>

View File

@ -2,7 +2,7 @@
<div class="user-list clearfix"> <div class="user-list clearfix">
<div class="layui-row layui-col-space20"> <div class="layui-row layui-col-space20">
{% for item in pager.items %} {% for item in pager.items %}
{% set group_url = url({'for':'web.im_group.show','id':item.id}) %} {% set group_url = url({'for':'web.group.show','id':item.id}) %}
{% set item.about = item.about ? item.about : '这家伙真懒,什么都没留下!' %} {% set item.about = item.about ? item.about : '这家伙真懒,什么都没留下!' %}
<div class="layui-col-md3"> <div class="layui-col-md3">
<div class="user-card"> <div class="user-card">

View File

@ -244,6 +244,8 @@ class Course extends Model
{ {
parent::initialize(); parent::initialize();
$this->keepSnapshots(true);
$this->addBehavior( $this->addBehavior(
new SoftDelete([ new SoftDelete([
'field' => 'deleted', 'field' => 'deleted',
@ -290,10 +292,9 @@ class Course extends Model
public function beforeUpdate() public function beforeUpdate()
{ {
$this->update_time = time(); if (time() - $this->update_time > 3 * 3600) {
$syncer = new CourseIndexSyncer();
if ($this->deleted == 1) { $syncer->addItem($this->id);
$this->published = 0;
} }
if (Text::startsWith($this->cover, 'http')) { if (Text::startsWith($this->cover, 'http')) {
@ -303,6 +304,12 @@ class Course extends Model
if (is_array($this->attrs)) { if (is_array($this->attrs)) {
$this->attrs = kg_json_encode($this->attrs); $this->attrs = kg_json_encode($this->attrs);
} }
if ($this->deleted == 1) {
$this->published = 0;
}
$this->update_time = time();
} }
public function afterCreate() public function afterCreate()
@ -314,9 +321,13 @@ class Course extends Model
public function afterUpdate() public function afterUpdate()
{ {
$syncer = new CourseIndexSyncer(); /**
* 课程标题和群组名称保持一致
$syncer->addItem($this->id); */
if ($this->hasUpdated('title')) {
$imGroup = ImGroup::findFirst(['course_id' => $this->id]);
$imGroup->update(['name' => $this->title]);
}
} }
public function afterFetch() public function afterFetch()

View File

@ -2,6 +2,7 @@
namespace App\Models; namespace App\Models;
use App\Services\Syncer\GroupIndex as GroupIndexSyncer;
use Phalcon\Mvc\Model\Behavior\SoftDelete; use Phalcon\Mvc\Model\Behavior\SoftDelete;
use Phalcon\Text; use Phalcon\Text;
@ -13,6 +14,7 @@ class ImGroup extends Model
*/ */
const TYPE_COURSE = 'course'; // 课程 const TYPE_COURSE = 'course'; // 课程
const TYPE_CHAT = 'chat'; // 聊天 const TYPE_CHAT = 'chat'; // 聊天
const TYPE_STAFF = 'staff'; // 员工
/** /**
* 主键编号 * 主键编号
@ -135,15 +137,20 @@ class ImGroup extends Model
public function beforeUpdate() public function beforeUpdate()
{ {
$this->update_time = time(); if (time() - $this->update_time > 3 * 3600) {
$syncer = new GroupIndexSyncer();
if ($this->deleted == 1) { $syncer->addItem($this->id);
$this->published = 0;
} }
if (Text::startsWith($this->avatar, 'http')) { if (Text::startsWith($this->avatar, 'http')) {
$this->avatar = self::getAvatarPath($this->avatar); $this->avatar = self::getAvatarPath($this->avatar);
} }
if ($this->deleted == 1) {
$this->published = 0;
}
$this->update_time = time();
} }
public function afterFetch() public function afterFetch()
@ -167,6 +174,7 @@ class ImGroup extends Model
return [ return [
self::TYPE_COURSE => '课程', self::TYPE_COURSE => '课程',
self::TYPE_CHAT => '聊天', self::TYPE_CHAT => '聊天',
self::TYPE_STAFF => '员工',
]; ];
} }

View File

@ -158,10 +158,12 @@ class Order extends Model
public function beforeCreate() public function beforeCreate()
{ {
$this->status = self::STATUS_PENDING;
$this->sn = date('YmdHis') . rand(1000, 9999);
$this->create_time = time(); $this->create_time = time();
$this->status = self::STATUS_PENDING;
$this->sn = date('YmdHis') . rand(1000, 9999);
if (is_array($this->item_info)) { if (is_array($this->item_info)) {
$this->item_info = kg_json_encode($this->item_info); $this->item_info = kg_json_encode($this->item_info);
} else { } else {
@ -211,8 +213,8 @@ class Order extends Model
public static function clientTypes() public static function clientTypes()
{ {
return [ return [
self::CLIENT_DESKTOP => 'desktop', self::CLIENT_PC => 'pc',
self::CLIENT_MOBILE => 'mobile', self::CLIENT_H5 => 'h5',
self::CLIENT_APP => 'app', self::CLIENT_APP => 'app',
self::CLIENT_MINI => 'mini', self::CLIENT_MINI => 'mini',
]; ];

View File

@ -126,9 +126,11 @@ class Trade extends Model
public function beforeCreate() public function beforeCreate()
{ {
$this->status = self::STATUS_PENDING;
$this->sn = date('YmdHis') . rand(1000, 9999);
$this->create_time = time(); $this->create_time = time();
$this->status = self::STATUS_PENDING;
$this->sn = date('YmdHis') . rand(1000, 9999);
} }
public function beforeUpdate() public function beforeUpdate()

View File

@ -3,6 +3,7 @@
namespace App\Models; namespace App\Models;
use App\Caches\MaxUserId as MaxUserIdCache; use App\Caches\MaxUserId as MaxUserIdCache;
use App\Services\Syncer\UserIndex as UserIndexSyncer;
use Phalcon\Mvc\Model\Behavior\SoftDelete; use Phalcon\Mvc\Model\Behavior\SoftDelete;
use Phalcon\Text; use Phalcon\Text;
@ -164,6 +165,8 @@ class User extends Model
{ {
parent::initialize(); parent::initialize();
$this->keepSnapshots(true);
$this->addBehavior( $this->addBehavior(
new SoftDelete([ new SoftDelete([
'field' => 'deleted', 'field' => 'deleted',
@ -185,11 +188,16 @@ class User extends Model
public function beforeUpdate() public function beforeUpdate()
{ {
$this->update_time = time(); if (time() - $this->update_time > 3 * 3600) {
$syncer = new UserIndexSyncer();
$syncer->addItem($this->id);
}
if (Text::startsWith($this->avatar, 'http')) { if (Text::startsWith($this->avatar, 'http')) {
$this->avatar = self::getAvatarPath($this->avatar); $this->avatar = self::getAvatarPath($this->avatar);
} }
$this->update_time = time();
} }
public function afterCreate() public function afterCreate()
@ -201,13 +209,14 @@ class User extends Model
public function afterUpdate() public function afterUpdate()
{ {
if ($this->hasUpdated('name') || $this->hasUpdated('avatar')) {
$imUser = ImUser::findFirst($this->id); $imUser = ImUser::findFirst($this->id);
$imUser->update([ $imUser->update([
'name' => $this->name, 'name' => $this->name,
'avatar' => $this->avatar, 'avatar' => $this->avatar,
]); ]);
} }
}
public function afterFetch() public function afterFetch()
{ {

View File

@ -120,12 +120,15 @@ class MyStorage extends Storage
if ($uploadFile == false) { if ($uploadFile == false) {
$name = $this->filter->sanitize($file->getName(), ['trim', 'string']);
$extension = $this->getFileExtension($file->getName()); $extension = $this->getFileExtension($file->getName());
$keyName = $this->generateFileName($extension, $prefix); $keyName = $this->generateFileName($extension, $prefix);
$path = $this->putFile($keyName, $file->getTempName()); $path = $this->putFile($keyName, $file->getTempName());
$uploadFile = new UploadFileModel(); $uploadFile = new UploadFileModel();
$uploadFile->name = $name;
$uploadFile->mime = $file->getRealType(); $uploadFile->mime = $file->getRealType();
$uploadFile->size = $file->getSize(); $uploadFile->size = $file->getSize();
$uploadFile->path = $path; $uploadFile->path = $path;

View File

@ -41,7 +41,7 @@ class CourseIndex extends Service
public function getSyncKey() public function getSyncKey()
{ {
return 'course_index_sync'; return 'sync:course_index';
} }
} }

View File

@ -41,7 +41,7 @@ class GroupIndex extends Service
public function getSyncKey() public function getSyncKey()
{ {
return 'group_index_sync'; return 'sync:group_index';
} }
} }

View File

@ -79,7 +79,7 @@ class Learning extends Service
public function getSyncKey() public function getSyncKey()
{ {
return 'learning_sync'; return 'sync:learning';
} }
} }

View File

@ -41,7 +41,7 @@ class UserIndex extends Service
public function getSyncKey() public function getSyncKey()
{ {
return 'user_index_sync'; return 'sync:user_index';
} }
} }

View File

@ -73,7 +73,6 @@
} }
.pager { .pager {
margin-top: 20px;
text-align: center; text-align: center;
} }
@ -1371,7 +1370,11 @@ body {
margin-top: 10px; margin-top: 10px;
} }
.im-group-list .user-card { .group-list {
margin-bottom: 20px;
}
.group-list .user-card {
height: 250px; height: 250px;
} }
@ -1602,24 +1605,6 @@ body {
width: 10%; width: 10%;
} }
.im-manage-wrap {
padding: 20px 20px 10px 20px;
background-color: #f2f2f2;
}
.im-search-wrap {
padding: 20px;
background-color: #f2f2f2;
}
.im-search-form {
margin-bottom: 10px;
}
.im-search-tab .layui-tab-content {
min-height: 300px;
}
.im-user-list .user-card { .im-user-list .user-card {
height: 150px; height: 150px;
font-size: 12px; font-size: 12px;
@ -1650,20 +1635,6 @@ body {
font-size: 10px; font-size: 10px;
} }
.im-user-list .type {
top: 10px;
right: 10px;
padding: 0 3px;
}
.im-user-list .action .layui-badge-rim {
cursor: pointer;
}
.im-user-list .layui-btn + .layui-btn {
margin-left: 5px;
}
.layim-msgbox { .layim-msgbox {
margin: 15px; margin: 15px;
} }

View File

@ -0,0 +1,75 @@
layui.use(['jquery', 'layim'], function () {
var $ = layui.jquery;
var layim = layui.layim;
var socket = new WebSocket(window.koogua.im.socket_url);
socket.onopen = function () {
console.log('socket connect success');
};
socket.onclose = function () {
console.log('socket connect close');
};
socket.onerror = function () {
console.log('socket connect error');
};
socket.onmessage = function (e) {
var data = JSON.parse(e.data);
console.log(data);
if (data.type === 'ping') {
socket.send('pong...');
} else if (data.type === 'bind_user') {
bindUser(data);
} else if (data.type === 'show_chat_msg') {
showChatMessage(data);
}
};
layim.config({
brief: true,
init: {
mine: {
id: "100000123",
username: "访客",
avatar: "//res.layui.com/images/fly/avatar/00.jpg",
status: "online",
}
},
maxLength: 1000,
});
layim.chat({
type: 'friend',
id: 1111111,
name: '在线客服一',
avatar: '//tp1.sinaimg.cn/5619439268/180/40030060651/1',
});
layim.on('sendMessage', function (res) {
sendChatMessage(res);
});
function bindUser(res) {
$.ajax({
type: 'POST',
url: '/im/user/bind',
data: {client_id: res.client_id}
});
}
function sendChatMessage(res) {
$.ajax({
type: 'POST',
url: '/im/msg/send',
data: {from: res.mine, to: res.to}
});
}
function showChatMessage(res) {
layim.getMessage(res.message);
}
});

View File

@ -1,14 +0,0 @@
layui.use(['form', 'helper'], function () {
var form = layui.form;
var helper = layui.helper;
form.on('submit(im_search)', function (data) {
var usersUrl = '/im/search?target=tab-users&type=user&query=' + data.field.query;
var groupsUrl = '/im/search?target=tab-groups&type=group&query=' + data.field.query;
helper.ajaxLoadHtml(usersUrl, 'tab-users');
helper.ajaxLoadHtml(groupsUrl, 'tab-groups');
return false;
});
});

View File

@ -2,7 +2,7 @@ layui.use(['jquery', 'layim'], function () {
var $ = layui.jquery; var $ = layui.jquery;
var layim = layui.layim; var layim = layui.layim;
var socket = new WebSocket(window.koogua.socketUrl); var socket = new WebSocket(window.koogua.im.socket_url);
socket.onopen = function () { socket.onopen = function () {
console.log('socket connect success'); console.log('socket connect success');
@ -23,7 +23,7 @@ layui.use(['jquery', 'layim'], function () {
socket.send('pong...'); socket.send('pong...');
} else if (data.type === 'bind_user') { } else if (data.type === 'bind_user') {
bindUser(data); bindUser(data);
refreshMsgBox(); refreshMessageBox();
} else if (data.type === 'new_group_user') { } else if (data.type === 'new_group_user') {
showNewGroupUserMessage(data); showNewGroupUserMessage(data);
} else if (data.type === 'show_online_tips') { } else if (data.type === 'show_online_tips') {
@ -32,13 +32,13 @@ layui.use(['jquery', 'layim'], function () {
setChatMessageCount(data); setChatMessageCount(data);
showChatMessage(data); showChatMessage(data);
} else if (data.type === 'refresh_msg_box') { } else if (data.type === 'refresh_msg_box') {
refreshMsgBox(); refreshMessageBox();
} else if (data.type === 'friend_accepted') { } else if (data.type === 'friend_accepted') {
friendAccepted(data); friendAccepted(data);
refreshMsgBox(); refreshMessageBox();
} else if (data.type === 'group_accepted') { } else if (data.type === 'group_accepted') {
groupAccepted(data); groupAccepted(data);
refreshMsgBox(); refreshMessageBox();
} }
}; };
@ -50,14 +50,7 @@ layui.use(['jquery', 'layim'], function () {
members: { members: {
url: '/im/group/users' url: '/im/group/users'
}, },
uploadImage: {
url: '/upload/im/image'
},
uploadFile: {
url: '/upload/im/file'
},
maxLength: 1000, maxLength: 1000,
find: '/im/find',
msgbox: '/im/msgbox', msgbox: '/im/msgbox',
chatLog: '/im/chatlog' chatLog: '/im/chatlog'
}); });
@ -193,10 +186,10 @@ layui.use(['jquery', 'layim'], function () {
}); });
} }
function refreshMsgBox() { function refreshMessageBox() {
$.ajax({ $.ajax({
type: 'GET', type: 'GET',
url: '/im/sys/msg/unread', url: '/im/notice/unread',
success: function (res) { success: function (res) {
if (res.count > 0) { if (res.count > 0) {
layim.msgbox(res.count); layim.msgbox(res.count);

View File

@ -36,13 +36,13 @@ layui.use(['jquery', 'layer', 'laypage'], function () {
} }
function loadPageHtml(target, page) { function loadPageHtml(target, page) {
$.get('/im/sys/msg', {page: page}, function (html) { $.get('/im/notice', {page: page}, function (html) {
target.html(html); target.html(html);
}); });
} }
function readNotices() { function readNotices() {
$.post('/im/sys/msg/read'); $.post('/im/notice/read');
} }
var action = { var action = {

View File

@ -0,0 +1,4 @@
layui.use(['jquery', 'layim'], function () {
});