Commit 04f7987679fcaf15e7fbbca92cfdc848ce546aa3
1 parent
aa7f1abc
test
Showing
66 changed files
with
4718 additions
and
0 deletions
Too many changes to show.
To preserve performance only 66 of 91 files are displayed.
trunk/Message/Api/Controller/AbstractController.class.php
0 → 100644
trunk/Message/Api/Controller/Message/MessInputController.class.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: Dell | ||
5 | + * Date: 2018/9/3 | ||
6 | + * Time: 17:57 | ||
7 | + */ | ||
8 | + | ||
9 | +namespace Api\Controller\Message; | ||
10 | + | ||
11 | +class MessInputController extends \Api\Controller\AbstractController | ||
12 | +{ | ||
13 | + | ||
14 | + public function Index_post() | ||
15 | + { | ||
16 | + $this->_result = [ | ||
17 | + 'mess' => '请求错误', | ||
18 | + ]; | ||
19 | + } | ||
20 | + | ||
21 | +} |
trunk/Message/Api/Lang/index.html
0 → 100644
No preview for this file type
trunk/Message/Api/Lang/zh-cn.php
0 → 100644
1 | +<?php | ||
2 | + | ||
3 | +return array( | ||
4 | + '_ERR_TEST' => '2011001:错误码示例', | ||
5 | + '_ERR_USER_INFO_FAIL' => '2011002:用户信息获取失败', | ||
6 | + '_ERR_ARTICLE_ALREADY_LIKE' => '2011003:已经点赞了', | ||
7 | + '_ERR_ARTICLE_NOT_FOUND' => '2011004:头条不存在', | ||
8 | + '_ERR_ATTACH_ID_EMPTY' => '2011005:附件ID不可为空', | ||
9 | + '_ERR_ATTACH_NOT_FOUND' => '2011006:附件不存在', | ||
10 | + '_ERR_ATTACH_IS_DOWNLOAD_FALSE' => '2011007:附件不支持下载', | ||
11 | + '_ERR_ARTICLE_CAN_NOT_READ' => '2011008:无阅读权限', | ||
12 | + '_ERR_ARTICLE_ALREADY_FAVORITE' => '2011009:已经收藏了', | ||
13 | + '_ERR_FAVORITE_STATUS_EMPTY' => '2011010:查询收藏结果失败', | ||
14 | + '_ERR_FAVORITE_OPERATE_FAIL' => '2011011:收藏操作失败', | ||
15 | + '_ERR_ATTACH_FILE_SIZE_OVERRUN' => '2011012:文件大小超过微信限制,不可下载', | ||
16 | +); |
trunk/Message/Api/index.html
0 → 100644
No preview for this file type
trunk/Message/Apicp/Controller/AbstractController.class.php
0 → 100644
trunk/Message/Apicp/Controller/News/CommentController.class.php
0 → 100644
1 | +<?php | ||
2 | +namespace Apicp\Controller\News; | ||
3 | + | ||
4 | +use Common\Common\Comment; | ||
5 | +use Common\Service\ArticleService; | ||
6 | + | ||
7 | +class CommentController extends \Apicp\Controller\AbstractController | ||
8 | +{ | ||
9 | + | ||
10 | + /** | ||
11 | + | ||
12 | + * DeleteComment | ||
13 | + * | ||
14 | + * @author tangxingguo | ||
15 | + | ||
16 | + * @desc 删除新闻 | ||
17 | + | ||
18 | + * @param int data_id:true 数据标识 | ||
19 | + | ||
20 | + * @return null | ||
21 | + | ||
22 | + */ | ||
23 | + public function Index_post() | ||
24 | + { | ||
25 | + $data_id = I('post.data_id', 0, 'trim'); | ||
26 | + | ||
27 | + // 数据标识不能为空 | ||
28 | + if (empty($data_id)) { | ||
29 | + E('_ERR_ARTICLE_DATA_ID_NOT_FOUND'); | ||
30 | + } | ||
31 | + | ||
32 | + $articleServ = new ArticleService(); | ||
33 | + $article = $articleServ->get_by_conds(['data_id' => $data_id]); | ||
34 | + if (empty($article)) { | ||
35 | + E('_ERR_ARTICLE_NOT_FOUND'); | ||
36 | + } | ||
37 | + | ||
38 | + // UC获取当前评论总数 | ||
39 | + $commentServ = &Comment::instance(); | ||
40 | + $commentList = $commentServ->listAll(['cmtObjid' => $data_id]); | ||
41 | + | ||
42 | + // 修改课程主表数据 | ||
43 | + if (isset($commentList['cmttlNums'])) { | ||
44 | + $total = $commentList['cmttlNums']; | ||
45 | + $articleServ->update_by_conds(['data_id' => $data_id], ['comment_total' => $total]); | ||
46 | + } | ||
47 | + } | ||
48 | +} |
trunk/Message/Apicp/Controller/News/CompanyQrcodeController.class.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * 获取公司二维码 | ||
4 | + * User: wangjiayu | ||
5 | + * Date: 2017-12-28 | ||
6 | + */ | ||
7 | +namespace Apicp\Controller\News; | ||
8 | + | ||
9 | +use Common\Common\CompanyQrcode; | ||
10 | + | ||
11 | +class CompanyQrcodeController extends \Apicp\Controller\AbstractController | ||
12 | +{ | ||
13 | + | ||
14 | + // 免登录 | ||
15 | + protected $_require_login = false; | ||
16 | + | ||
17 | + public function Index() | ||
18 | + { | ||
19 | + // 实例化类 | ||
20 | + $CompanyQrcode = &CompanyQrcode::instance(); | ||
21 | + | ||
22 | + // 获取二维码 | ||
23 | + $qr_code = $CompanyQrcode->showCompanyQrcode(); | ||
24 | + | ||
25 | + // 返回二维码 | ||
26 | + $this->_result = $qr_code; | ||
27 | + } | ||
28 | +} |
trunk/Message/Apicp/Controller/News/DeleteController.class.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: liyifei2012it | ||
5 | + * Date: 17/4/11 | ||
6 | + * Time: 18:24 | ||
7 | + */ | ||
8 | +namespace Apicp\Controller\News; | ||
9 | + | ||
10 | +use Com\PackageValidate; | ||
11 | +use Common\Common\AttachOperation; | ||
12 | +use Common\Common\DataCenter; | ||
13 | +use Common\Common\Constant; | ||
14 | +use Common\Common\RpcFavoriteHelper; | ||
15 | +use Common\Service\ArticleService; | ||
16 | +use Common\Service\TaskService; | ||
17 | +use Common\Service\AttachService; | ||
18 | +use VcySDK\Service; | ||
19 | +use VcySDK\Cron; | ||
20 | + | ||
21 | +class DeleteController extends \Apicp\Controller\AbstractController | ||
22 | +{ | ||
23 | + /** | ||
24 | + * Delete | ||
25 | + * @author zhonglei | ||
26 | + * @desc 删除新闻 | ||
27 | + * @param Array article_ids:true 新闻ID数组 | ||
28 | + * @return mixed | ||
29 | + */ | ||
30 | + public function Index_post() | ||
31 | + { | ||
32 | + // 验证规则 | ||
33 | + $rules = [ | ||
34 | + 'article_ids' => 'require|array', | ||
35 | + ]; | ||
36 | + | ||
37 | + // 验证数据 | ||
38 | + $validate = new PackageValidate($rules, [], array_keys($rules)); | ||
39 | + $postData = $validate->postData; | ||
40 | + $article_ids = $postData['article_ids']; | ||
41 | + | ||
42 | + $artServ = new ArticleService(); | ||
43 | + $list = $artServ->list_by_conds(['article_id' => $article_ids]); | ||
44 | + | ||
45 | + if (empty($list)) { | ||
46 | + return true; | ||
47 | + } | ||
48 | + | ||
49 | + // 删除首页推送 | ||
50 | + foreach ($article_ids as $article_id) { | ||
51 | + $artServ->delNewsRpc($article_id); | ||
52 | + } | ||
53 | + | ||
54 | + // 删除新闻 | ||
55 | + $artServ->delete_by_conds(['article_id' => $article_ids]); | ||
56 | + | ||
57 | + // 删除新闻附件 | ||
58 | + $attachServ = new AttachService(); | ||
59 | + | ||
60 | + // 从UC附件服务器删除 | ||
61 | + $attach_serv = new AttachOperation(); | ||
62 | + $attach_serv->delete_attach( | ||
63 | + APP_DIR, | ||
64 | + 'article', | ||
65 | + $article_ids | ||
66 | + ); | ||
67 | + | ||
68 | + // 删除业务数据库附件 | ||
69 | + $attachServ->delete_by_conds(['article_id' => $article_ids]); | ||
70 | + | ||
71 | + // 删除应用数据时,RPC同步收藏状态 | ||
72 | + $rpcFavorite = &RpcFavoriteHelper::instance(); | ||
73 | + $rpcFavorite->updateStatus($postData['article_ids']); | ||
74 | + | ||
75 | + // 数据中心删除点赞埋点 | ||
76 | + $dataCenter = &DataCenter::instance(); | ||
77 | + $dataCenter->delLike($article_ids); | ||
78 | + // 数据中心删除点赞埋点 | ||
79 | + | ||
80 | + // 数据中心删除评论埋点 | ||
81 | + $dataCenter->delComment($article_ids); | ||
82 | + // 数据中心删除评论埋点 | ||
83 | + | ||
84 | + // 数据中心删除点击量埋点 | ||
85 | + $dataCenter->delClick($article_ids); | ||
86 | + // 数据中心删除点击量埋点 | ||
87 | + | ||
88 | + $taskServ = new TaskService(); | ||
89 | + $task_list = $taskServ->list_by_conds(['article_id' => $article_ids]); | ||
90 | + | ||
91 | + if (empty($task_list)) { | ||
92 | + return true; | ||
93 | + } | ||
94 | + | ||
95 | + $cron_ids = array_filter(array_column($task_list, 'cron_id')); | ||
96 | + $cronSdk = new Cron(Service::instance()); | ||
97 | + | ||
98 | + // 删除计划任务 | ||
99 | + foreach ($cron_ids as $cron_id) { | ||
100 | + $cronSdk->delete($cron_id); | ||
101 | + } | ||
102 | + | ||
103 | + return true; | ||
104 | + } | ||
105 | +} |
trunk/Message/Apicp/Controller/News/ExportLikeListController.class.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: liyifei2012it | ||
5 | + * Date: 18/7/6 | ||
6 | + * Time: 10:53 | ||
7 | + */ | ||
8 | +namespace Apicp\Controller\News; | ||
9 | + | ||
10 | +use Com\PackageValidate; | ||
11 | +use Com\PythonExcel; | ||
12 | +use Common\Common\ExportDownload; | ||
13 | +use Common\Common\NewsHelper; | ||
14 | +use Common\Common\User; | ||
15 | +use Common\Service\LikeService; | ||
16 | +use Common\Service\ArticleService; | ||
17 | + | ||
18 | +class ExportLikeListController extends \Apicp\Controller\AbstractController | ||
19 | +{ | ||
20 | + /** | ||
21 | + * LikeList | ||
22 | + * @desc 导出点赞列表 | ||
23 | + * @param int article_id:true 新闻ID | ||
24 | + * @return mixed | ||
25 | + */ | ||
26 | + public function Index_post() | ||
27 | + { | ||
28 | + // 验证规则 | ||
29 | + $rules = [ | ||
30 | + 'article_id' => 'require|integer', | ||
31 | + ]; | ||
32 | + | ||
33 | + // 验证数据 | ||
34 | + $validate = new PackageValidate($rules, [], array_keys($rules)); | ||
35 | + $postData = $validate->postData; | ||
36 | + | ||
37 | + // 取新闻信息 | ||
38 | + $articleServ = new ArticleService(); | ||
39 | + $article = $articleServ->get($postData['article_id']); | ||
40 | + if (empty($article)) { | ||
41 | + E('_ERR_ARTICLE_NOT_FOUND'); | ||
42 | + } | ||
43 | + | ||
44 | + // 点赞列表 | ||
45 | + $likeServ = new LikeService(); | ||
46 | + $likeList = $likeServ->list_by_conds(['article_id' => $postData['article_id']]); | ||
47 | + | ||
48 | + if ($likeList) { | ||
49 | + // UC人员信息 | ||
50 | + $uids = array_column($likeList, 'uid'); | ||
51 | + $userServ = &User::instance(); | ||
52 | + $userList = $userServ->listAll(['memUids' => $uids]); | ||
53 | + $userList = array_combine_by_key($userList, 'memUid'); | ||
54 | + | ||
55 | + // Excel文件名前缀 | ||
56 | + $titleSuffix = '_点赞人员'; | ||
57 | + | ||
58 | + // Excel列名 | ||
59 | + $columns = ['姓名', '组织', '岗位', '角色', '手机号']; | ||
60 | + | ||
61 | + // Excel行数据 | ||
62 | + $rows = []; | ||
63 | + if ($userList) { | ||
64 | + $newsHelper = &NewsHelper::instance(); | ||
65 | + | ||
66 | + foreach ($likeList as $k => $v) { | ||
67 | + $uid = $v['uid']; | ||
68 | + if (isset($userList[$uid])) { | ||
69 | + $user = $userList[$uid]; | ||
70 | + | ||
71 | + $rows[] = [ | ||
72 | + $user['memUsername'], | ||
73 | + $newsHelper->getDpPath($user), | ||
74 | + $user['memJob'], | ||
75 | + $user['memRole'], | ||
76 | + $user['memMobile'], | ||
77 | + ]; | ||
78 | + } | ||
79 | + } | ||
80 | + } | ||
81 | + | ||
82 | + $title = $article['title'] . $titleSuffix . rgmdate(MILLI_TIME, '_ymdHis'); | ||
83 | + $filename = ExportDownload::get_down_dir($this->_login->user['eaId']) . $title . '.xls'; | ||
84 | + $result = PythonExcel::instance()->write($filename, $columns, $rows); | ||
85 | + | ||
86 | + if ($result === true) { | ||
87 | + // 写入数据到下载中心 | ||
88 | + $conditon = [ | ||
89 | + 'title' => $title, | ||
90 | + 'ea_id' => $this->_login->user['eaId'], | ||
91 | + 'type' => ExportDownload::EXCEL_TYPE, | ||
92 | + 'size' => filesize($filename), | ||
93 | + 'username' => $this->_login->user['eaRealname'], | ||
94 | + 'url' => $filename, | ||
95 | + 'app_dir' => APP_DIR | ||
96 | + ]; | ||
97 | + | ||
98 | + ExportDownload::insert_down_load($conditon); | ||
99 | + } | ||
100 | + } | ||
101 | + | ||
102 | + return true; | ||
103 | + } | ||
104 | +} |
trunk/Message/Apicp/Controller/News/ExportReadListController.class.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: liyifei2012it | ||
5 | + * Date: 18/7/5 | ||
6 | + * Time: 11:22 | ||
7 | + */ | ||
8 | +namespace Apicp\Controller\News; | ||
9 | + | ||
10 | +use Com\PythonExcel; | ||
11 | +use Common\Common\ExportDownload; | ||
12 | +use Common\Common\NewsHelper; | ||
13 | +use Com\PackageValidate; | ||
14 | +use Common\Common\Constant; | ||
15 | +use Common\Common\User; | ||
16 | +use Common\Service\ArticleService; | ||
17 | +use Common\Service\RightService; | ||
18 | +use Common\Service\ReadService; | ||
19 | + | ||
20 | +class ExportReadListController extends \Apicp\Controller\AbstractController | ||
21 | +{ | ||
22 | + /** | ||
23 | + * ExportReadList | ||
24 | + * @desc 导出阅读列表 | ||
25 | + * @param Int article_id:true 新闻ID | ||
26 | + * @param Int read_type:true:1 阅读类型(1=未读,2=已读) | ||
27 | + * @param String username 姓名 | ||
28 | + * @param Array dp_ids 部门ID | ||
29 | + * @param Array job_ids 职位ID | ||
30 | + * @param Array role_ids 角色ID | ||
31 | + * @return mixed | ||
32 | + */ | ||
33 | + public function Index_post() | ||
34 | + { | ||
35 | + // 验证规则 | ||
36 | + $rules = [ | ||
37 | + 'article_id' => 'require|integer', | ||
38 | + 'read_type' => 'require|integer', | ||
39 | + 'username' => 'max:64', | ||
40 | + 'dp_ids' => 'array', | ||
41 | + 'job_ids' => 'array', | ||
42 | + 'role_ids' => 'array', | ||
43 | + ]; | ||
44 | + | ||
45 | + // 验证数据 | ||
46 | + $validate = new PackageValidate($rules, [], array_keys($rules)); | ||
47 | + $postData = $validate->postData; | ||
48 | + | ||
49 | + // 取新闻信息 | ||
50 | + $articleServ = new ArticleService(); | ||
51 | + $article = $articleServ->get($postData['article_id']); | ||
52 | + if (empty($article)) { | ||
53 | + E('_ERR_ARTICLE_NOT_FOUND'); | ||
54 | + } | ||
55 | + | ||
56 | + // UC筛选uid | ||
57 | + $uidCond = $this->formatConds($postData); | ||
58 | + | ||
59 | + // 获取人员ID | ||
60 | + $newsHelper = &NewsHelper::instance(); | ||
61 | + list(, $uids_study, $uids_unstudy) = $newsHelper->getReadData($article['article_id'], $uidCond); | ||
62 | + | ||
63 | + // Excel列名 | ||
64 | + $columns = ['姓名', '组织', '岗位', '角色', '手机号']; | ||
65 | + | ||
66 | + // 实例化对象 | ||
67 | + $userServ = &User::instance(); | ||
68 | + | ||
69 | + $rows = []; | ||
70 | + if ($postData['read_type'] == Constant::READ_STATUS_IS_YES) { | ||
71 | + $titleSuffix = '_已学人员'; | ||
72 | + $columns[] = '阅读时间'; | ||
73 | + | ||
74 | + // 已读人员列表 | ||
75 | + $readConds = [ | ||
76 | + 'uid' => $uids_study, | ||
77 | + 'article_id' => $postData['article_id'], | ||
78 | + ]; | ||
79 | + $readServ = new ReadService(); | ||
80 | + $readList = $readServ->list_by_conds($readConds); | ||
81 | + | ||
82 | + // 人员详情列表 | ||
83 | + $userList = $userServ->listByUid(array_column($readList, 'uid')); | ||
84 | + $userList = array_combine_by_key($userList, 'memUid'); | ||
85 | + foreach ($readList as $item) { | ||
86 | + $uid = $item['uid']; | ||
87 | + $user = $userList[$uid]; | ||
88 | + | ||
89 | + // Excel行数据 | ||
90 | + $rows[] = [ | ||
91 | + $user['memUsername'], | ||
92 | + $newsHelper->getDpPath($user), | ||
93 | + $user['memJob'], | ||
94 | + $user['memRole'], | ||
95 | + $user['memMobile'], | ||
96 | + rgmdate($item['created'], 'Y/m/d H:i'), | ||
97 | + ]; | ||
98 | + } | ||
99 | + | ||
100 | + } else { | ||
101 | + $titleSuffix = '_未学人员'; | ||
102 | + | ||
103 | + if ($uids_unstudy) { | ||
104 | + $userServ = &User::instance(); | ||
105 | + $userList = $userServ->listUsersAll(['memUids' => $uids_unstudy]); | ||
106 | + | ||
107 | + if ($userList) { | ||
108 | + foreach ($userList as $user) { | ||
109 | + $rows[] = [ | ||
110 | + $user['memUsername'], | ||
111 | + $newsHelper->getDpPath($user), | ||
112 | + $user['memJob'], | ||
113 | + $user['memRole'], | ||
114 | + $user['memMobile'], | ||
115 | + ]; | ||
116 | + } | ||
117 | + } | ||
118 | + } | ||
119 | + } | ||
120 | + | ||
121 | + $title = $article['title'] . $titleSuffix . rgmdate(MILLI_TIME, '_ymdHis'); | ||
122 | + $filename = ExportDownload::get_down_dir($this->_login->user['eaId']) . $title . '.xls'; | ||
123 | + $result = PythonExcel::instance()->write($filename, $columns, $rows); | ||
124 | + | ||
125 | + if ($result === true) { | ||
126 | + // 写入数据到下载中心 | ||
127 | + $conditon = [ | ||
128 | + 'title' => $title, | ||
129 | + 'ea_id' => $this->_login->user['eaId'], | ||
130 | + 'type' => ExportDownload::EXCEL_TYPE, | ||
131 | + 'size' => filesize($filename), | ||
132 | + 'username' => $this->_login->user['eaRealname'], | ||
133 | + 'url' => $filename, | ||
134 | + 'app_dir' => APP_DIR | ||
135 | + ]; | ||
136 | + | ||
137 | + ExportDownload::insert_down_load($conditon); | ||
138 | + } | ||
139 | + | ||
140 | + return true; | ||
141 | + } | ||
142 | + | ||
143 | + /** | ||
144 | + * 将搜索条件转化为用户UID | ||
145 | + * @author tangxingguo | ||
146 | + * @param array $postData 用户提交的数据 | ||
147 | + * @return array|bool | ||
148 | + */ | ||
149 | + private function formatConds($postData) | ||
150 | + { | ||
151 | + $condUids = []; | ||
152 | + | ||
153 | + $userServ = &User::instance(); | ||
154 | + if (isset($postData['username'])) { | ||
155 | + // UC | ||
156 | + $userConds = ['memUsername' => $postData['username']]; | ||
157 | + $list = $userServ->listAll($userConds); | ||
158 | + $condUids = array_column($list, 'memUid'); | ||
159 | + } | ||
160 | + | ||
161 | + // 部门、岗位、角色搜索交集 | ||
162 | + $right = array_intersect_key_reserved($postData, ['dp_ids', 'job_ids', 'role_ids'], true); | ||
163 | + if (!empty($right)) { | ||
164 | + $rightServ = new RightService(); | ||
165 | + $rights = $rightServ->formatPostData($right); | ||
166 | + $unitUids = $rightServ->getUidsByRight($rights); | ||
167 | + if (!empty($condUids)) { | ||
168 | + // 筛选已经有值,取交集 | ||
169 | + $condUids = array_intersect($condUids, $unitUids); | ||
170 | + } else { | ||
171 | + $condUids = $unitUids; | ||
172 | + } | ||
173 | + } | ||
174 | + | ||
175 | + // 如果有查询 并且 结果为空 | ||
176 | + if ((!empty($right) || !empty($postData['username'])) && empty($condUids)) { | ||
177 | + return false; | ||
178 | + } | ||
179 | + | ||
180 | + return $condUids; | ||
181 | + } | ||
182 | +} |
trunk/Message/Apicp/Controller/News/InfoController.class.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: tangxingguo | ||
5 | + * Date: 2017/4/11 | ||
6 | + * Time: 17:06 | ||
7 | + */ | ||
8 | +namespace Apicp\Controller\News; | ||
9 | + | ||
10 | +use Common\Service\ArticleService; | ||
11 | +use Common\Service\RightService; | ||
12 | +use Common\Service\AttachService; | ||
13 | + | ||
14 | +class InfoController extends \Apicp\Controller\AbstractController | ||
15 | +{ | ||
16 | + /** | ||
17 | + * Info | ||
18 | + * @author liyifei | ||
19 | + * @desc 新闻详情 | ||
20 | + * @param int article_id:true 新闻公告ID | ||
21 | + * @return array 新闻详情 | ||
22 | + * array( | ||
23 | + 'news_status' => 1, // 新闻状态(1=草稿,2=已发布,3=预发布) | ||
24 | + 'convert_status' => 1, // 转码状态(1=转码中,2=转码成功,3=转码失败) | ||
25 | + 'article_id' => 123, // 新闻ID | ||
26 | + 'title' => '重大新闻', // 新闻标题 | ||
27 | + 'cover_id' => 'b3ddbc502e307665f346cbd6e52cc10d', // 封面图片ID | ||
28 | + 'cover_url' => 'http://qy.vchangyi.org', // 封面图片地址 | ||
29 | + 'is_show_cover' => 1, // 是否正文显示封面图片(1=不显示,2=显示) | ||
30 | + 'summary' => '零食增加卫龙系列', // 摘要 | ||
31 | + 'parent_id' => 1, // 父分类ID | ||
32 | + 'parent_name' => '一级分类', // 父分类名称 | ||
33 | + 'class_id' => 2, // 分类ID | ||
34 | + 'class_name' => '内部公告', // 分类名称 | ||
35 | + 'author' => '张三', // 作者 | ||
36 | + 'at_video' => array( // 视频附件 | ||
37 | + array( | ||
38 | + 'at_id' => 'b3ddbc502e307665f346cbd6e52cc10d', // 附件ID | ||
39 | + 'at_name' => '小视频.mp4', // 附件名 | ||
40 | + 'at_time' => '123456543000', // 音、视频类型的播放时长(单位:毫秒) | ||
41 | + 'at_size' => 10240.12, // 附件尺寸(单位KB) | ||
42 | + 'at_url' => 'http://qy.vchangyi.com', // 附件地址 | ||
43 | + 'at_convert_url' => 'http://qy.vchangyi.com', // 视频转码后url | ||
44 | + 'at_suffix' => '.xml', // 附件后缀 | ||
45 | + 'convert_status' => 1, // 转码状态(1=转码中,2=转码成功,3=转码失败) | ||
46 | + ), | ||
47 | + ), | ||
48 | + 'at_audio' => array( // 音频附件 | ||
49 | + array( | ||
50 | + 'at_id' => 'b3ddbc502e307665f346cbd6e52cc10d', // 附件ID | ||
51 | + 'at_name' => '音频.mp3', // 附件名 | ||
52 | + 'at_time' => '123456543000', // 音、视频类型的播放时长(单位:毫秒) | ||
53 | + 'at_size' => 1024.12, // 附件尺寸(单位KB) | ||
54 | + 'at_url' => 'http://qy.vchangyi.com', // 附件地址 | ||
55 | + 'at_convert_url' => '', // 转码后url,音频附件为空 | ||
56 | + 'at_suffix' => '.txt', // 附件后缀 | ||
57 | + 'convert_status' => 2, // 转码状态(1=转码中,2=转码成功,3=转码失败) | ||
58 | + ), | ||
59 | + ), | ||
60 | + 'at_file' => array( // 文件附件 | ||
61 | + array( | ||
62 | + 'at_id' => 'b3ddbc502e307665f346cbd6e52cc10d', // 附件ID | ||
63 | + 'at_name' => '文档.doc', // 附件名 | ||
64 | + 'at_size' => 123.12, // 附件大小(单位:字节) | ||
65 | + 'at_url' => 'http://qy.vchangyi.com', // 附件地址 | ||
66 | + 'at_convert_url' => 'http://qy.vchangyi.com', // 文件转码后url | ||
67 | + 'at_suffix' => '.xml', // 附件后缀 | ||
68 | + 'convert_status' => 3, // 转码状态(1=转码中,2=转码成功,3=转码失败) | ||
69 | + ), | ||
70 | + ), | ||
71 | + 'right' => array( // 新闻阅读权限 | ||
72 | + 'is_all' => 1, // 是否全公司(1=否,2=是) | ||
73 | + 'tag_list' => array( | ||
74 | + array( | ||
75 | + 'tag_id' => '3CDBB2867F0000012C7F8D28432943BB', | ||
76 | + 'tag_name' => 'liyifei001' | ||
77 | + ), | ||
78 | + ), | ||
79 | + 'dp_list' => array( | ||
80 | + array( | ||
81 | + 'dp_id' => 'B65085507F0000017D3965FCB20CA747', | ||
82 | + 'dp_name' => '一飞冲天' | ||
83 | + ), | ||
84 | + ), | ||
85 | + 'user_list' => array( | ||
86 | + array( | ||
87 | + 'uid' => 'B4B3BA5B7F00000173E870DA6ADFEA2A', | ||
88 | + 'username' => '缘来素雅', | ||
89 | + 'face' => 'http://shp.qpic.cn/bizmp/gdZUibR6BHrmiar6pZ6pLfRyZSVaXJicn2CsvKRdI9gccXRfP2NrDvJ8A/' | ||
90 | + ), | ||
91 | + ) | ||
92 | + 'job_list' => array(// 职位 | ||
93 | + array( | ||
94 | + 'job_id' => '62C316437F0000017AE8E6ACC7EFAC22',// 职位ID | ||
95 | + 'job_name' => '攻城狮',// 职位名称 | ||
96 | + ), | ||
97 | + ), | ||
98 | + 'role_list' => array(// 角色 | ||
99 | + array( | ||
100 | + 'role_id' => '62C354B97F0000017AE8E6AC4FD6F429',// 角色ID | ||
101 | + 'role_name' => '国家元首',// 角色名称 | ||
102 | + ), | ||
103 | + ), | ||
104 | + ), | ||
105 | + 'is_download' => 1, // 附件是否支持下载(1=不支持,2=支持) | ||
106 | + 'is_secret' => 1, // 是否保密(1=不保密,2=保密) | ||
107 | + 'is_share' => 1, // 允许分享(1=不允许,2=允许) | ||
108 | + 'is_notice' => 1, // 消息通知(1=不开启,2=开启) | ||
109 | + 'is_comment' => 1, // 评论功能(1=不开启,2=开启) | ||
110 | + 'is_like' => 1, // 点赞功能(1=不开启,2=开启) | ||
111 | + 'is_recommend' => 1, // 首页推荐(1=不开启,2=开启) | ||
112 | + 'content' => '语言是民族的重要特征之一', // 新闻内容 | ||
113 | + 'strategy_setting' => 3, // 积分策略设置(1=启用默认策略;2=不启用策略;3=自定义策略) | ||
114 | + 'strategys' => array( // 自定义策略数据(积分策略设置=2时,返回空字符串) | ||
115 | + array( | ||
116 | + 'action_key' => 'one_learning', // 触发行为key | ||
117 | + 'strategy_id' => '123', // 策略ID | ||
118 | + ), | ||
119 | + ), | ||
120 | + 'credit_strategy_setting' => 3, // 学分策略设置(1=启用默认策略;2=不启用策略;3=自定义策略) | ||
121 | + 'credit_strategys' => array( // 自定义策略数据(学分策略设置=2时,返回空字符串) | ||
122 | + array( | ||
123 | + 'action_key' => 'one_learning', // 触发行为key | ||
124 | + 'strategy_id' => '123', // 策略ID | ||
125 | + ), | ||
126 | + ), | ||
127 | + ) | ||
128 | + */ | ||
129 | + public function Index_post() | ||
130 | + { | ||
131 | + $article_id = I('post.article_id', 0, 'intval'); | ||
132 | + $articleServ = new ArticleService(); | ||
133 | + $article = $articleServ->get($article_id); | ||
134 | + if (empty($article)) { | ||
135 | + E('_ERR_ARTICLE_NOT_FOUND'); | ||
136 | + } | ||
137 | + | ||
138 | + // 格式化新闻数据 | ||
139 | + $formatArticle = $articleServ->formatData($article); | ||
140 | + | ||
141 | + // 格式化附件数据 | ||
142 | + $user = $this->_login->user; | ||
143 | + $attachServ = new AttachService(); | ||
144 | + $formatAttach = $attachServ->formatData($article['article_id'], $user); | ||
145 | + | ||
146 | + // 将格式化后的附件数据格式,从对象转为数组 | ||
147 | + $formatAttach['at_audio'] = isset($formatAttach['at_audio']) ? array_values($formatAttach['at_audio']) : []; | ||
148 | + $formatAttach['at_video'] = isset($formatAttach['at_video']) ? array_values($formatAttach['at_video']) : []; | ||
149 | + $formatAttach['at_file'] = isset($formatAttach['at_file']) ? array_values($formatAttach['at_file']) : []; | ||
150 | + | ||
151 | + // 格式化新闻权限数据 | ||
152 | + $rightServ = new RightService(); | ||
153 | + $formatRight['right'] = $rightServ->getData(['article_id' => $article_id]); | ||
154 | + | ||
155 | + // 组合数据 | ||
156 | + $data = array_merge($formatArticle, $formatRight, $formatAttach); | ||
157 | + | ||
158 | + $this->_result = $data; | ||
159 | + } | ||
160 | +} |
trunk/Message/Apicp/Controller/News/LikeListController.class.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: tangxingguo | ||
5 | + * Date: 2017/4/11 | ||
6 | + * Time: 19:10 | ||
7 | + */ | ||
8 | +namespace Apicp\Controller\News; | ||
9 | + | ||
10 | +use Com\PackageValidate; | ||
11 | +use Common\Common\User; | ||
12 | +use Common\Service\LikeService; | ||
13 | + | ||
14 | +class LikeListController extends \Apicp\Controller\AbstractController | ||
15 | +{ | ||
16 | + /** | ||
17 | + * LikeList | ||
18 | + * @desc 点赞列表 | ||
19 | + * @param int article_id:true 新闻ID | ||
20 | + * @return array 点赞列表 | ||
21 | + * array( | ||
22 | + 'list' => array( // 点赞列表 | ||
23 | + 'uid' => 'B4B3BAFE7F00000173E870DA83A9751E', // 人员ID | ||
24 | + 'username' => '张三', // 人员姓名 | ||
25 | + 'face' => 'http://shp.qpic.cn/bizmp/gdZUibR6BHrkuqSjvCzX33qvZpCIOaYZiaFRnciae9WgxiaWXqxkqIOyeg/', // 头像 | ||
26 | + 'created' => 1434567890000, // 点赞时间 | ||
27 | + ), | ||
28 | + ); | ||
29 | + */ | ||
30 | + | ||
31 | + public function Index_post() | ||
32 | + { | ||
33 | + // 验证规则 | ||
34 | + $rules = [ | ||
35 | + 'article_id' => 'require|integer', | ||
36 | + 'page' => 'integer', | ||
37 | + 'limit' => 'integer', | ||
38 | + ]; | ||
39 | + | ||
40 | + // 验证数据 | ||
41 | + $validate = new PackageValidate($rules, [], array_keys($rules)); | ||
42 | + $postData = $validate->postData; | ||
43 | + | ||
44 | + // 点赞列表 | ||
45 | + $likeServ = new LikeService(); | ||
46 | + list($start, $perpage) = page_limit($postData['page'], $postData['limit']); | ||
47 | + $likeList = $likeServ->list_by_conds(['article_id' => $postData['article_id']], [$start, $perpage]); | ||
48 | + $total = $likeServ->count_by_conds(['article_id' => $postData['article_id']]); | ||
49 | + | ||
50 | + if ($likeList) { | ||
51 | + // 人员信息 | ||
52 | + $uids = array_column($likeList, 'uid'); | ||
53 | + $userServ = &User::instance(); | ||
54 | + $userList = $userServ->listAll(['memUids' => $uids]); | ||
55 | + $userList = array_combine_by_key($userList, 'memUid'); | ||
56 | + | ||
57 | + // 合并头像 | ||
58 | + if ($userList) { | ||
59 | + foreach ($likeList as $k => $v) { | ||
60 | + if (isset($userList[$v['uid']])) { | ||
61 | + $likeList[$k]['username'] = isset($userList[$v['uid']]) ? $userList[$v['uid']]['memUsername'] : ''; | ||
62 | + $likeList[$k]['face'] = isset($userList[$v['uid']]) ? $userList[$v['uid']]['memFace'] : ''; | ||
63 | + } | ||
64 | + } | ||
65 | + } | ||
66 | + | ||
67 | + } | ||
68 | + | ||
69 | + $this->_result = [ | ||
70 | + 'list' => $likeList, | ||
71 | + 'total' => $total, | ||
72 | + 'page' => $postData['page'], | ||
73 | + 'limit' => $postData['limit'] | ||
74 | + ]; | ||
75 | + } | ||
76 | +} |
trunk/Message/Apicp/Controller/News/ListController.class.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: liyifei2012it | ||
5 | + * Date: 17/4/11 | ||
6 | + * Time: 15:07 | ||
7 | + */ | ||
8 | +namespace Apicp\Controller\News; | ||
9 | + | ||
10 | +use Com\PackageValidate; | ||
11 | +use Common\Common\Constant; | ||
12 | +use Common\Service\ArticleService; | ||
13 | +use Common\Service\ClassService; | ||
14 | + | ||
15 | +class ListController extends \Apicp\Controller\AbstractController | ||
16 | +{ | ||
17 | + /** | ||
18 | + * List | ||
19 | + * @desc 新闻列表 | ||
20 | + * @ahthor liyifei | ||
21 | + * @param Int page:1 当前页(默认第一页) | ||
22 | + * @param Int limit:20 当前页条数 | ||
23 | + * @param string start_time 更新开始时间(毫秒级时间戳) | ||
24 | + * @param string end_time 更新结束时间(毫秒级时间戳) | ||
25 | + * @param string title 标题关键词 | ||
26 | + * @param Int class_id 分类ID | ||
27 | + * @param Int news_status 发布状态(1=草稿;2=已发布;3=预发布) | ||
28 | + * @return array | ||
29 | + * array( | ||
30 | + * 'total' => 100, // 总条数 | ||
31 | + * 'page' => 1, // 当前页 | ||
32 | + * 'limit' => 20, // 当前页条数 | ||
33 | + * 'list' => array( // 列表数据 | ||
34 | + * 'article_id' => 1, // 新闻ID | ||
35 | + * 'title' => '电商冲击,实体店靠什么赢', // 标题 | ||
36 | + * 'class_name' => '导购FM', // 栏目 | ||
37 | + * 'is_secret' => 1, // 是否保密(1=不保密,2=保密) | ||
38 | + * 'read_total' => 1, // 已阅读人数 | ||
39 | + * 'allow_read_total' => 30, // 可阅读人数 | ||
40 | + * 'news_status' => 1, // 发布状态(1=草稿,2=已发布,3=预发布) | ||
41 | + * 'convert_status' => 1, // 转码状态(1=转码中,2=转码成功,3=转码失败) | ||
42 | + * 'like_total' => 12, // 点赞人数 | ||
43 | + * 'comment_total' => 34, // 评论人数 | ||
44 | + * 'send_time' => '1491897290000', // 最后更新时间(毫秒级时间戳) | ||
45 | + * 'top_time' => '1491897290000', // 置顶时间(毫秒级时间戳,0为未置顶) | ||
46 | + * 'qr_code' => 'awddwdad.awddadad?awdadwad=awdada', // 二维码链接 | ||
47 | + * ), | ||
48 | + * ) | ||
49 | + */ | ||
50 | + public function Index_post() | ||
51 | + { | ||
52 | + // 验证规则 | ||
53 | + $rules = [ | ||
54 | + 'page' => 'integer', | ||
55 | + 'limit' => 'integer', | ||
56 | + 'start_time' => 'integer', | ||
57 | + 'end_time' => 'integer', | ||
58 | + 'title' => 'max:64', | ||
59 | + 'class_id' => 'integer', | ||
60 | + 'news_status' => 'integer', | ||
61 | + ]; | ||
62 | + | ||
63 | + // 验证数据 | ||
64 | + $validate = new PackageValidate($rules, [], array_keys($rules)); | ||
65 | + $postData = $validate->postData; | ||
66 | + | ||
67 | + // 默认值 | ||
68 | + $postData['page'] = isset($postData['page']) ? $postData['page'] : Constant::PAGING_DEFAULT_PAGE; | ||
69 | + $postData['limit'] = isset($postData['limit']) ? $postData['limit'] : Constant::PAGING_DEFAULT_LIMIT; | ||
70 | + | ||
71 | + // 组合条件 | ||
72 | + $conds = []; | ||
73 | + if (isset($postData['start_time'])) { | ||
74 | + $conds['send_time > ?'] = $postData['start_time']; | ||
75 | + } | ||
76 | + if (isset($postData['end_time'])) { | ||
77 | + $conds['send_time < ?'] = $postData['end_time']; | ||
78 | + } | ||
79 | + if (isset($postData['title'])) { | ||
80 | + // 查询%化需要转义 | ||
81 | + $postData['title'] = str_replace("%", '\%', $postData['title']); | ||
82 | + $conds['title like ?'] = '%' . $postData['title'] . '%'; | ||
83 | + } | ||
84 | + if (isset($postData['class_id'])) { | ||
85 | + $classServ = new ClassService(); | ||
86 | + $childList = $classServ->list_by_conds(['parent_id' => $postData['class_id']]); | ||
87 | + $class_ids = array_column($childList, 'class_id'); | ||
88 | + $class_ids[] = $postData['class_id']; | ||
89 | + $conds['class_id in (?)'] = $class_ids; | ||
90 | + } | ||
91 | + if (isset($postData['news_status'])) { | ||
92 | + if ($postData['news_status'] == Constant::NEWS_STATUS_READY_SEND) { | ||
93 | + $conds['news_status in (?)'] = [Constant::NEWS_STATUS_READY_SEND, Constant::NEWS_STATUS_TIMING_RELEASE]; | ||
94 | + } else { | ||
95 | + $conds['news_status = ?'] = $postData['news_status']; | ||
96 | + } | ||
97 | + } | ||
98 | + | ||
99 | + // 分页 | ||
100 | + list($start, $perpage) = page_limit($postData['page'], $postData['limit']); | ||
101 | + | ||
102 | + // 排序 | ||
103 | + $order_option = ['top_time' => 'desc', 'send_time' => 'desc']; | ||
104 | + | ||
105 | + // 列表 | ||
106 | + $articleServ = new ArticleService(); | ||
107 | + $list = $articleServ->list_by_conds($conds, [$start, $perpage], $order_option); | ||
108 | + if ($list) { | ||
109 | + // 可阅读人数 | ||
110 | + foreach ($list as $k => $v) { | ||
111 | + $list[$k]['allow_read_total'] = $v['read_total'] + $v['unread_total']; | ||
112 | + // 加入二维码链接 | ||
113 | + $list[$k]['qr_code'] = oaUrl('Frontend/Index/NewsQrcode/index', ['article_id' => $v['article_id']]); | ||
114 | + } | ||
115 | + } | ||
116 | + | ||
117 | + // 数据总数 | ||
118 | + $total = $articleServ->count_by_conds($conds); | ||
119 | + | ||
120 | + $this->_result = [ | ||
121 | + 'page' => $postData['page'], | ||
122 | + 'limit' => $postData['limit'], | ||
123 | + 'total' => intval($total), | ||
124 | + 'list' => $list, | ||
125 | + ]; | ||
126 | + } | ||
127 | +} |
trunk/Message/Apicp/Controller/News/ReadListController.class.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: tangxingguo | ||
5 | + * Date: 2017/4/13 | ||
6 | + * Time: 11:48 | ||
7 | + */ | ||
8 | +namespace Apicp\Controller\News; | ||
9 | + | ||
10 | +use Com\PackageValidate; | ||
11 | +use Common\Common\Constant; | ||
12 | +use Common\Common\User; | ||
13 | +use Common\Service\ArticleService; | ||
14 | +use Common\Service\ReadService; | ||
15 | +use Common\Service\RightService; | ||
16 | + | ||
17 | +class ReadListController extends \Apicp\Controller\AbstractController | ||
18 | +{ | ||
19 | + | ||
20 | + /** | ||
21 | + * ReadList | ||
22 | + * @desc 阅读列表 | ||
23 | + * @param Int article_id:true 新闻ID | ||
24 | + * @param Int read_type:true 阅读类型(1=未读,2=已读) | ||
25 | + * @param Int page 页码 | ||
26 | + * @param Int limit 每页数据条数 | ||
27 | + * @return array 阅读列表 | ||
28 | + * array( | ||
29 | + 'article_id' => 123, // 新闻ID | ||
30 | + 'read_type' => 1, // 阅读类型(1=未读,2=已读) | ||
31 | + 'title' => '', // 新闻标题 | ||
32 | + 'send_time' => '', // 更新时间 | ||
33 | + 'page' => '', // 页码 | ||
34 | + 'limit' => '', // 每页数据条数 | ||
35 | + 'read_total' => '', // 已读总数 | ||
36 | + 'unread_total' => '', // 未读总数 | ||
37 | + 'list' => array( | ||
38 | + 'username' => '张三', // 姓名 | ||
39 | + 'dp_name' => array('技术部'), // 所属部门 | ||
40 | + 'job' => 'PHP', // 职位 | ||
41 | + 'mobile' => '15821392414', // 手机号码 | ||
42 | + 'created' => '1234566898988', // 阅读时间(毫秒级时间戳) | ||
43 | + ), | ||
44 | + ); | ||
45 | + */ | ||
46 | + public function Index_post() | ||
47 | + { | ||
48 | + // 验证规则 | ||
49 | + $rules = [ | ||
50 | + 'article_id' => 'require|integer', | ||
51 | + 'read_type' => 'require|integer', | ||
52 | + 'page' => 'integer', | ||
53 | + 'limit' => 'integer', | ||
54 | + 'dp_ids' => 'array', | ||
55 | + 'job_ids' => 'array', | ||
56 | + 'role_ids' => 'array', | ||
57 | + 'username' => 'max:64', | ||
58 | + ]; | ||
59 | + | ||
60 | + // 验证数据 | ||
61 | + $validate = new PackageValidate($rules, [], array_keys($rules)); | ||
62 | + $postData = $validate->postData; | ||
63 | + | ||
64 | + // 默认值 | ||
65 | + $postData['page'] = isset($postData['page']) ? $postData['page'] : Constant::PAGING_DEFAULT_PAGE; | ||
66 | + $postData['limit'] = isset($postData['limit']) ? $postData['limit'] : Constant::PAGING_DEFAULT_LIMIT; | ||
67 | + // 查询条件 | ||
68 | + $uidCond = $this->formatConds($postData); | ||
69 | + | ||
70 | + // 取新闻信息 | ||
71 | + $articleServ = new ArticleService(); | ||
72 | + $newsInfo = $articleServ->get($postData['article_id']); | ||
73 | + if (empty($newsInfo)) { | ||
74 | + E('_ERR_ARTICLE_NOT_FOUND'); | ||
75 | + } | ||
76 | + | ||
77 | + $list = []; | ||
78 | + $total = 0; | ||
79 | + $readServ = new ReadService(); | ||
80 | + | ||
81 | + $read_total = 0; | ||
82 | + $unread_total = 0; | ||
83 | + if ($uidCond !== false) { | ||
84 | + // 已读 | ||
85 | + $readConds = ['article_id' => $postData['article_id']]; | ||
86 | + $read_total = $readServ->count_by_conds($readConds); | ||
87 | + | ||
88 | + if (!empty($uidCond)) { | ||
89 | + $readConds['uid'] = $uidCond; | ||
90 | + } | ||
91 | + if ($postData['read_type'] == Constant::READ_STATUS_IS_YES) { | ||
92 | + list($start, $perpage) = page_limit($postData['page'], $postData['limit']); | ||
93 | + $readList = $readServ->list_by_conds($readConds, [$start, $perpage]); | ||
94 | + $userServ = &User::instance(); | ||
95 | + $userlist = $userServ->listByUid(array_column($readList, 'uid')); | ||
96 | + $userlist = array_combine_by_key($userlist, 'memUid'); | ||
97 | + foreach ($readList as &$item) { | ||
98 | + $uid = $item['uid']; | ||
99 | + $list[] = [ | ||
100 | + 'username' => $userlist[$uid]['memUsername'], | ||
101 | + 'dp_name' => empty($userlist[$uid]['dpName']) ? | ||
102 | + [] : array_column($userlist[$uid]['dpName'], 'dpName'), | ||
103 | + 'job' => $userlist[$uid]['memJob'], | ||
104 | + 'role' => $userlist[$uid]['memRole'], | ||
105 | + 'mobile' => $userlist[$uid]['memMobile'], | ||
106 | + 'created' => $item['created'] | ||
107 | + ]; | ||
108 | + } | ||
109 | + | ||
110 | + $total = $read_total; | ||
111 | + } | ||
112 | + | ||
113 | + // 未读 | ||
114 | + list($uids_all, $uids_read, $uids_unread, $unread_total) = | ||
115 | + $this->getReadData($postData['article_id'], $uidCond); | ||
116 | + | ||
117 | + if ($postData['read_type'] == Constant::READ_STATUS_IS_NO) { | ||
118 | + $total = count($uids_unread); | ||
119 | + // 取未读人员信息 | ||
120 | + if ($uids_unread) { | ||
121 | + $userServ = &User::instance(); | ||
122 | + $userList = $userServ->listByConds(['memUids' => $uids_unread], $postData['page'], $postData['limit']); | ||
123 | + if ($userList) { | ||
124 | + foreach ($userList['list'] as $v) { | ||
125 | + $list[] = [ | ||
126 | + 'uid' => $v['memUid'], | ||
127 | + 'username' => $v['memUsername'], | ||
128 | + 'dp_name' => empty($v['dpName']) ? [] : array_column($v['dpName'], 'dpName'), | ||
129 | + 'job' => $v['memJob'], | ||
130 | + 'role' => $v['memRole'], | ||
131 | + 'mobile' => $v['memMobile'], | ||
132 | + ]; | ||
133 | + } | ||
134 | + } | ||
135 | + | ||
136 | + } | ||
137 | + } | ||
138 | + } | ||
139 | + | ||
140 | + $this->_result = [ | ||
141 | + 'article_id' => $postData['article_id'], | ||
142 | + 'read_type' => $postData['read_type'], | ||
143 | + 'limit' => $postData['limit'], | ||
144 | + 'page' => $postData['page'], | ||
145 | + 'title' => $newsInfo['title'], | ||
146 | + 'send_time' => $newsInfo['send_time'], | ||
147 | + 'read_total' => $read_total, | ||
148 | + 'unread_total' => $unread_total, | ||
149 | + 'total' => $total, | ||
150 | + 'list' => $list, | ||
151 | + ]; | ||
152 | + } | ||
153 | + | ||
154 | + /** | ||
155 | + * 将搜索条件转化为用户UID | ||
156 | + * @author tangxingguo | ||
157 | + * @param array $postData 用户提交的数据 | ||
158 | + * @return array|bool | ||
159 | + */ | ||
160 | + private function formatConds($postData) | ||
161 | + { | ||
162 | + $condUids = []; | ||
163 | + | ||
164 | + $userServ = &User::instance(); | ||
165 | + if (isset($postData['username'])) { | ||
166 | + // UC | ||
167 | + $userConds = ['memUsername' => $postData['username']]; | ||
168 | + $list = $userServ->listAll($userConds); | ||
169 | + $condUids = array_column($list, 'memUid'); | ||
170 | + } | ||
171 | + // 部门、岗位、角色搜索交集 | ||
172 | + $right = array_intersect_key_reserved($postData, ['dp_ids', 'job_ids', 'role_ids'], true); | ||
173 | + | ||
174 | + // 部门/岗位存在 名字存在 | ||
175 | + if (!empty($right) && isset($postData['username'])) { | ||
176 | + $rightServ = new RightService(); | ||
177 | + $rights = $rightServ->formatPostData($right); | ||
178 | + $unitUids = $rightServ->getUidsByRight($rights); | ||
179 | + if (!empty($condUids)) { | ||
180 | + // 筛选已经有值,取交集 | ||
181 | + $condUids = array_intersect($condUids, $unitUids); | ||
182 | + } else { | ||
183 | + //$condUids = $unitUids; | ||
184 | + return false; | ||
185 | + } | ||
186 | + } | ||
187 | + | ||
188 | + // 部门/岗位存在 名字存在 人名不存在 | ||
189 | + if (!empty($right) && !isset($postData['username'])) { | ||
190 | + $rightServ = new RightService(); | ||
191 | + $rights = $rightServ->formatPostData($right); | ||
192 | + $unitUids = $rightServ->getUidsByRight($rights); | ||
193 | + $condUids = $unitUids; | ||
194 | + } | ||
195 | + | ||
196 | + // 如果有查询 并且 结果为空 | ||
197 | + if ((!empty($right) || !empty($postData['username'])) && empty($condUids)) { | ||
198 | + return false; | ||
199 | + } | ||
200 | + | ||
201 | + return $condUids; | ||
202 | + } | ||
203 | + | ||
204 | + /** | ||
205 | + * 获取新闻可读、已读、未读人员ID数组 | ||
206 | + * @author zhonglei | ||
207 | + * @param int $article_id 新闻ID | ||
208 | + * @return array [0 => 可读人员ID, 1 => 已读人员ID, 2 => 未读人员ID] | ||
209 | + */ | ||
210 | + public function getReadData($article_id, $uidCond) | ||
211 | + { | ||
212 | + $uids_all = []; | ||
213 | + $uids_read = []; | ||
214 | + $uids_unread = []; | ||
215 | + | ||
216 | + // 查询条件 | ||
217 | + $conds = ['article_id' => $article_id]; | ||
218 | + // 获取权限数据 | ||
219 | + $rightServ = new RightService(); | ||
220 | + $right_list = $rightServ->list_by_conds($conds); | ||
221 | + $rights = $rightServ->formatDBData($right_list); | ||
222 | + | ||
223 | + if (empty($rights)) { | ||
224 | + return [$uids_all, $uids_read, $uids_unread]; | ||
225 | + } | ||
226 | + | ||
227 | + // 获取可读数据 | ||
228 | + $uids_all = $rightServ->getUidsByRight($rights); | ||
229 | + // 获取已读数据 | ||
230 | + $readServ = new ReadService(); | ||
231 | + if (!empty($uidCond)) { | ||
232 | + $conds['uid'] = $uidCond; | ||
233 | + } | ||
234 | + $study_list = $readServ->list_by_conds($conds); | ||
235 | + $uids_read = array_column($study_list, 'uid'); | ||
236 | + $uids_unread = array_values( | ||
237 | + array_diff( | ||
238 | + // 如果外部传了条件 | ||
239 | + !empty($uidCond) ? array_intersect($uids_all, $uidCond) : $uids_all, | ||
240 | + $uids_read | ||
241 | + ) | ||
242 | + ); | ||
243 | + // 已经学习人数 (跟传入条件无关) | ||
244 | + $studyListWithOutConds = $readServ->list_by_conds(['article_id' => $article_id]); | ||
245 | + $studyListWithOutConds = array_column($studyListWithOutConds, 'uid'); | ||
246 | + | ||
247 | + // 未读数据 | ||
248 | + return [$uids_all, $uids_read, $uids_unread, count(array_diff($uids_all, $studyListWithOutConds))]; | ||
249 | + } | ||
250 | +} |
trunk/Message/Apicp/Controller/News/ReleaseController.class.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: 大熊 | ||
5 | + * Date: 2018/5/17 | ||
6 | + * Time: 15:05 | ||
7 | + */ | ||
8 | + | ||
9 | +namespace Apicp\Controller\News; | ||
10 | + | ||
11 | +use Apicp\Controller\AbstractController; | ||
12 | +use Common\Common\Constant; | ||
13 | +use Common\Common\NewsHelper; | ||
14 | +use Common\Service\ArticleService; | ||
15 | +use Common\Service\ClassService; | ||
16 | +use Think\Log; | ||
17 | + | ||
18 | +class ReleaseController extends AbstractController | ||
19 | +{ | ||
20 | + public function index_post() | ||
21 | + { | ||
22 | + $param = I('post.'); | ||
23 | + | ||
24 | + // 获取数据信息 | ||
25 | + $service = new ArticleService(); | ||
26 | + $data = $service->get($param['article_id']); | ||
27 | + | ||
28 | + // 不为定时发布时不做处理 | ||
29 | + if ($data['news_status'] != Constant::NEWS_STATUS_TIMING_RELEASE) { | ||
30 | + $this->_result = ['state' => true]; | ||
31 | + return true; | ||
32 | + } | ||
33 | + | ||
34 | + // 判断素材状态,若转码成功则为发布状态,否则为预发布状态 | ||
35 | + $updateData = ['news_status' => Constant::NEWS_STATUS_SEND]; | ||
36 | + if ($data['convert_status'] == Constant::FILE_STATUS_CONVERT) { | ||
37 | + $updateData['news_status'] = Constant::NEWS_STATUS_READY_SEND; | ||
38 | + } | ||
39 | + | ||
40 | + $service->update($param['article_id'], $updateData); | ||
41 | + | ||
42 | + // 当为发布时 | ||
43 | + if ($updateData['news_status'] == Constant::NEWS_STATUS_SEND) { | ||
44 | + try { | ||
45 | + // 获取顶级分类名称 | ||
46 | + $classServ = new ClassService(); | ||
47 | + $class = $classServ->getTopClass($data['class_id']); | ||
48 | + $data['class_name'] = $class['class_name']; | ||
49 | + | ||
50 | + // 发送未读提醒 | ||
51 | + if ($data['is_notice'] == Constant::NEWS_IS_NOTICE_TRUE) { | ||
52 | + $newsHelper = &NewsHelper::instance(); | ||
53 | + list($uids_all, $uids_read, $uids_unread) = $newsHelper->getReadData($param['article_id']); | ||
54 | + $newsHelper->sendUnreadMsg($uids_unread, $data); | ||
55 | + } | ||
56 | + | ||
57 | + // RPC推送到运营中心 | ||
58 | + if ($data['is_recommend'] == Constant::NEWS_IS_RECOMMEND_TRUE) { | ||
59 | + $service->addNewsRpc($param['article_id'], []); | ||
60 | + } | ||
61 | + } catch (\Exception $e) { | ||
62 | + Log::record('头条立即发布错误'.$e->getMessage()); | ||
63 | + } | ||
64 | + } | ||
65 | + | ||
66 | + $this->_result = ['state' => true]; | ||
67 | + return true; | ||
68 | + } | ||
69 | +} | ||
0 | \ No newline at end of file | 70 | \ No newline at end of file |
trunk/Message/Apicp/Controller/News/RemindController.class.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: liyifei2012it | ||
5 | + * Date: 17/4/11 | ||
6 | + * Time: 18:20 | ||
7 | + */ | ||
8 | + | ||
9 | +namespace Apicp\Controller\News; | ||
10 | + | ||
11 | +use Com\PackageValidate; | ||
12 | +use Common\Common\Constant; | ||
13 | +use Common\Common\NewsHelper; | ||
14 | +use Common\Service\ClassService; | ||
15 | +use Common\Service\ArticleService; | ||
16 | + | ||
17 | +class RemindController extends \Apicp\Controller\AbstractController | ||
18 | +{ | ||
19 | + /** | ||
20 | + * Remind | ||
21 | + * @author liyifei | ||
22 | + * @desc 未读提醒 | ||
23 | + * @param Int article_id:true 新闻ID | ||
24 | + * @param array uids:false 用户UIDS集合格式(array[1,2,3]) | ||
25 | + * @return array | ||
26 | + */ | ||
27 | + public function Index_post() | ||
28 | + { | ||
29 | + $uids = I('post.uids'); | ||
30 | + // 验证规则 | ||
31 | + $rules = [ | ||
32 | + 'article_id' => 'require|integer', | ||
33 | + ]; | ||
34 | + | ||
35 | + // 验证数据 | ||
36 | + $validate = new PackageValidate($rules, [], array_keys($rules)); | ||
37 | + $postData = $validate->postData; | ||
38 | + | ||
39 | + // 获取新闻详情 | ||
40 | + $articleServ = new ArticleService(); | ||
41 | + $article = $articleServ->get($postData['article_id']); | ||
42 | + | ||
43 | + if (empty($article)) { | ||
44 | + E('_ERR_ARTICLE_NOT_FOUND'); | ||
45 | + } | ||
46 | + | ||
47 | + | ||
48 | + // 草稿和预发布不允许发送提醒 | ||
49 | + if (in_array($article['news_status'], [Constant::NEWS_STATUS_DRAFT, Constant::NEWS_STATUS_READY_SEND])) { | ||
50 | + E('_ERR_ARTICLE_STATUS_FAIL'); | ||
51 | + } | ||
52 | + | ||
53 | + // 获取顶级分类名称 | ||
54 | + $classServ = new ClassService(); | ||
55 | + $class = $classServ->getTopClass($article['class_id']); | ||
56 | + $article['class_name'] = $class['class_name']; | ||
57 | + | ||
58 | + // 获取未读人员列表 | ||
59 | + $newsHelper = &NewsHelper::instance(); | ||
60 | + list($uids_all, $uids_read, $uids_unread) = $newsHelper->getReadData($postData['article_id']); | ||
61 | + | ||
62 | + // 提醒人员UID | ||
63 | + if (!empty($uids)) { | ||
64 | + $uids_unread = array_intersect($uids_unread, $uids); | ||
65 | + } | ||
66 | + // 发送未读提醒 | ||
67 | + $newsHelper->sendUnreadMsg($uids_unread, $article); | ||
68 | + } | ||
69 | +} |
trunk/Message/Apicp/Controller/News/SaveController.class.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: liyifei2012it | ||
5 | + * Date: 17/4/11 | ||
6 | + * Time: 18:33 | ||
7 | + */ | ||
8 | + | ||
9 | +namespace Apicp\Controller\News; | ||
10 | + | ||
11 | +use Common\Common\ArticleHelper; | ||
12 | +use Common\Common\Attach; | ||
13 | +use Com\PackageValidate; | ||
14 | +use Common\Common\Constant; | ||
15 | +use Common\Common\NewsHelper; | ||
16 | +use Common\Service\AttachService; | ||
17 | +use Common\Service\ClassService; | ||
18 | +use Common\Service\ReadService; | ||
19 | +use Common\Service\RightService; | ||
20 | +use Common\Service\ArticleService; | ||
21 | +use Common\Service\TaskService; | ||
22 | +use phpDocumentor\Reflection\Types\String_; | ||
23 | +use VcySDK\Cron; | ||
24 | +use VcySDK\Service; | ||
25 | + | ||
26 | +class SaveController extends \Apicp\Controller\AbstractController | ||
27 | +{ | ||
28 | + /** | ||
29 | + * Save | ||
30 | + * @author liyifei | ||
31 | + * @desc 新闻保存(创建、修改) | ||
32 | + * @param Int article_id 新闻ID | ||
33 | + * @param String title:true 标题 | ||
34 | + * @param Int class_id:true 分类ID | ||
35 | + * @param String author:true 作者 | ||
36 | + * @param String content 内容 | ||
37 | + * @param String cover_id:true 封面图片ID | ||
38 | + * @param String is_show_cover:true:2 是否正文显示封面图片(1=不显示,2=显示) | ||
39 | + * @param array file_at_ids 文件附件ID数组 | ||
40 | + * @param array audio_at_ids 音频附件ID数组 | ||
41 | + * @param array video_at_info 视频附件详情 | ||
42 | + * @param String video_at_info[].at_id:true 视频附件ID | ||
43 | + * @param String video_at_info[].at_name:true 视频名称 | ||
44 | + * @param String video_at_info[].at_size:true 视频大小(单位:字节) | ||
45 | + * @param String video_at_info[].at_time:true 视频时长 | ||
46 | + * @param array is_download:true:1 附件是否支持下载(1=不支持,2=支持) | ||
47 | + * @param String summary:true 摘要(最多输入150字符) | ||
48 | + * @param array right:true 阅读范围 | ||
49 | + * @param Int right.is_all 是否全公司(1=否;2=是) | ||
50 | + * @param array right.uids 人员ID | ||
51 | + * @param array right.dp_ids 部门ID | ||
52 | + * @param array right.tag_ids 标签ID | ||
53 | + * @param array right.job_ids 职位ID | ||
54 | + * @param array right.role_ids 角色ID | ||
55 | + * @param String link 外部链接 | ||
56 | + * @param Int is_jump 是否直接跳转外链(1=不直接跳转,2=直接跳转) | ||
57 | + * @param Int is_secret:true:1 是否保密(1=不保密,2=保密) | ||
58 | + * @param Int is_share:true:1 允许分享(1=不允许,2=允许) | ||
59 | + * @param Int is_notice:true:2 消息通知(1=不开启,2=开启) | ||
60 | + * @param Int is_comment:true:2 评论功能(1=不开启,2=开启) | ||
61 | + * @param Int is_like:true:2 点赞功能(1=不开启,2=开启) | ||
62 | + * @param Int is_recommend:true:2 首页推荐(1=不开启,2=开启) | ||
63 | + * @param Int news_status:true:1 新闻状态(1=草稿与保存并预览,2=已发布) | ||
64 | + * @param Int strategy_setting:true:2 积分策略设置(1=启用默认策略;2=不启用策略;3=自定义策略) | ||
65 | + * @param array strategys 自定义策略数据 | ||
66 | + * @param String strategys[].action_key 触发行为key | ||
67 | + * @param String strategys[].strategy_id 策略ID | ||
68 | + * @param Int credit_strategy_setting:true:2 学分策略设置(1=启用默认策略;2=不启用策略;3=自定义策略) | ||
69 | + * @param array credit_strategys 自定义策略数据 | ||
70 | + * @param String credit_strategys[].action_key 触发行为key | ||
71 | + * @param String credit_strategys[].strategy_id 策略ID | ||
72 | + * @return array 二维码链接 | ||
73 | + * array( | ||
74 | + * 'qr_code' => 'asdadsdasdad.asdsadasdsa?asdasdds=adasdadad', | ||
75 | + * ) | ||
76 | + */ | ||
77 | + public function Index_post() | ||
78 | + { | ||
79 | + // 验证规则 | ||
80 | + $rules = [ | ||
81 | + // 非必填 | ||
82 | + 'article_id' => 'integer', | ||
83 | + 'summary' => 'max:120', | ||
84 | + 'audio_at_ids' => 'array', | ||
85 | + 'file_at_ids' => 'array', | ||
86 | + 'video_at_info' => 'array', | ||
87 | + 'link' => 'max:500', | ||
88 | + 'is_jump' => 'integer|in:1,2', | ||
89 | + 'strategys' => 'array', | ||
90 | + 'credit_strategys' => 'array', | ||
91 | + 'cron_time' => 'max:20', | ||
92 | + // 必填 | ||
93 | + 'title' => 'require|max:64', | ||
94 | + 'class_id' => 'require|integer', | ||
95 | + 'author' => 'require|max:20', | ||
96 | + 'cover_id' => 'require', | ||
97 | + 'right' => 'require|array', | ||
98 | + 'is_show_cover' => 'require|integer|in:1,2', | ||
99 | + 'is_download' => 'require|integer|in:1,2', | ||
100 | + 'is_secret' => 'require|integer|in:1,2', | ||
101 | + 'is_share' => 'require|integer|in:1,2', | ||
102 | + 'is_notice' => 'require|integer|in:1,2', | ||
103 | + 'is_comment' => 'require|integer|in:1,2', | ||
104 | + 'comment_anonymous' => 'require|integer|in:1,2', | ||
105 | + 'is_like' => 'require|integer|in:1,2', | ||
106 | + 'is_recommend' => 'require|integer|in:1,2', | ||
107 | + 'news_status' => 'require|integer|in:1,2,4', | ||
108 | + 'strategy_setting' => 'require|integer|in:1,2,3', | ||
109 | + 'credit_strategy_setting' => 'require|integer|in:1,2,3', | ||
110 | + ]; | ||
111 | + | ||
112 | + // 验证请求数据 | ||
113 | + $validate = new PackageValidate($rules, [], array_keys($rules)); | ||
114 | + $postData = $validate->postData; | ||
115 | + | ||
116 | + // 完整请求参数 | ||
117 | + $postData['content'] = I('post.content', '', 'trim'); | ||
118 | + $fixData = $this->_fixData($postData); | ||
119 | + | ||
120 | + // 格式化权限数据 | ||
121 | + $rightServ = new RightService(); | ||
122 | + $formatRights = $rightServ->formatPostData($postData['right']); | ||
123 | + if (empty($formatRights)) { | ||
124 | + | ||
125 | + E('_ERR_ARTICLE_RIGHT_PARAM'); | ||
126 | + } | ||
127 | + | ||
128 | + // 校验传参(验证器无法验证的部分) | ||
129 | + $this->_checkData($fixData); | ||
130 | + | ||
131 | + // 组合写入article表的数据 | ||
132 | + $sqlData = $this->_fixSqlData($fixData); | ||
133 | + | ||
134 | + // 保存新闻 | ||
135 | + $articleServ = new ArticleService(); | ||
136 | + if ($fixData['article_id'] == 0) { | ||
137 | + // 创建新闻 | ||
138 | + $articleId = $articleServ->insert($sqlData); | ||
139 | + if (!$articleId) { | ||
140 | + | ||
141 | + E('_ERR_ARTICLE_SAVE_FAILED'); | ||
142 | + } | ||
143 | + | ||
144 | + // 二维码的链接 | ||
145 | + $qr_code = oaUrl('Frontend/Index/NewsQrcode/index', ['article_id' => $articleId]); | ||
146 | + | ||
147 | + // RPC推送到运营中心 | ||
148 | + if ($sqlData['is_recommend'] == Constant::NEWS_IS_RECOMMEND_TRUE) { | ||
149 | + | ||
150 | + $articleServ->addNewsRpc($articleId, $postData['right']); | ||
151 | + } | ||
152 | + | ||
153 | + } else { | ||
154 | + // 修改前的新闻数据 | ||
155 | + $articleOld = $articleServ->get($fixData['article_id']); | ||
156 | + $articleId = $articleOld['article_id']; | ||
157 | + | ||
158 | + // 如果存在定时发布,删除定时发布 | ||
159 | + if ($articleOld['news_status'] == Constant::NEWS_STATUS_TIMING_RELEASE) { | ||
160 | + // 实例化定时任务类 | ||
161 | + $cron_serv = new Cron(Service::instance()); | ||
162 | + $cron_serv->delete($articleOld['release_crid']); | ||
163 | + } | ||
164 | + | ||
165 | + // 二维码的链接 | ||
166 | + $qr_code = oaUrl('Frontend/Index/NewsQrcode/index', ['article_id' => $articleId]); | ||
167 | + | ||
168 | + if (!in_array($fixData['news_status'], [Constant::NEWS_STATUS_DRAFT, Constant::NEWS_STATUS_READY_SEND, Constant::NEWS_STATUS_TIMING_RELEASE])) { | ||
169 | + $this->_operationRpc($fixData['article_id'], $sqlData, $postData['right']); | ||
170 | + } | ||
171 | + // RPC推送到运营中心 | ||
172 | + | ||
173 | + | ||
174 | + // 修改新闻 | ||
175 | + $articleServ->update_by_conds(['article_id' => $fixData['article_id']], $sqlData); | ||
176 | + } | ||
177 | + | ||
178 | + // 定时发布, 增加定时任务 | ||
179 | + if ($sqlData['news_status'] == Constant::NEWS_STATUS_TIMING_RELEASE) { | ||
180 | + $articleServ->cronAdd($articleId, $sqlData['cron_time']); | ||
181 | + } | ||
182 | + | ||
183 | + // 推送未读消息(草稿、预发布除外;新建已发布新闻、草稿新闻修改为已发布新闻时,也推送消息;) | ||
184 | + $newsHelper = &NewsHelper::instance(); | ||
185 | + if (!in_array($sqlData['news_status'], [ | ||
186 | + Constant::NEWS_STATUS_DRAFT, | ||
187 | + Constant::NEWS_STATUS_READY_SEND, | ||
188 | + Constant::NEWS_STATUS_TIMING_RELEASE | ||
189 | + ]) && $sqlData['is_notice'] == Constant::NEWS_IS_NOTICE_TRUE) { | ||
190 | + // 发布过就不推消息了 | ||
191 | + if ($fixData['article_id'] == 0 || (isset($articleOld) && $articleOld['news_status'] == Constant::NEWS_STATUS_DRAFT && $sqlData['news_status'] == Constant::NEWS_STATUS_SEND)) { | ||
192 | + // 新闻所在顶级分类信息 | ||
193 | + $classServ = new ClassService(); | ||
194 | + $class = $classServ->getTopClass($sqlData['class_id']); | ||
195 | + $sqlData['class_name'] = $class['class_name']; | ||
196 | + | ||
197 | + $sqlData['article_id'] = $articleId; | ||
198 | + $newsHelper->sendNotice($sqlData, $formatRights); | ||
199 | + } | ||
200 | + } | ||
201 | + | ||
202 | + // 创建计划任务(预发布新闻:视频、文件附件) 添加定时任务 | ||
203 | + if ($sqlData['news_status'] == Constant::NEWS_STATUS_READY_SEND || $sqlData['news_status'] == Constant::NEWS_STATUS_TIMING_RELEASE) { | ||
204 | + | ||
205 | + $taskServ = new TaskService(); | ||
206 | + $taskServ->createCheckAttachTask($articleId); | ||
207 | + } | ||
208 | + | ||
209 | + // 保存阅读范围 | ||
210 | + $rightServ->saveData(['article_id' => $articleId], $postData['right']); | ||
211 | + | ||
212 | + // 修改新闻未读人数 | ||
213 | + list($uids_all, ,) = $newsHelper->getReadData($articleId); | ||
214 | + sort($uids_all); | ||
215 | + // 兼容多次编辑文章未读人数变化问题 | ||
216 | + $readServ = new ReadService(); | ||
217 | + $read_list = $readServ->list_by_conds([ | ||
218 | + 'article_id' => $articleId, | ||
219 | + 'uid' => $uids_all, | ||
220 | + ]); | ||
221 | + | ||
222 | + // 如果存在已读取过的人员 | ||
223 | + if (!empty($read_list)) { | ||
224 | + // 获取已读取人员的uids | ||
225 | + $read_uids = array_column($read_list, 'uid'); | ||
226 | + $uids_all = array_diff($uids_all, $read_uids); | ||
227 | + } | ||
228 | + | ||
229 | + $articleServ->update($articleId, ['unread_total' => count($uids_all)]); | ||
230 | + | ||
231 | + // 保存附件(已发布、预发布的新闻,不可修改附件) | ||
232 | + if ($fixData['article_id'] == 0 || (isset($articleOld) && $articleOld['news_status'] == Constant::NEWS_STATUS_DRAFT)) { | ||
233 | + | ||
234 | + $attachServ = new AttachService(); | ||
235 | + $attachServ->saveData($articleId, $fixData); | ||
236 | + } | ||
237 | + | ||
238 | + $this->_result = ['qr_code' => $qr_code]; | ||
239 | + } | ||
240 | + | ||
241 | + /** | ||
242 | + * 补全请求数据 | ||
243 | + * @param array $postData 请求数据 | ||
244 | + * @return array | ||
245 | + */ | ||
246 | + private function _fixData($postData) | ||
247 | + { | ||
248 | + // 非必填参数,补全默认值 | ||
249 | + $postData['article_id'] = isset($postData['article_id']) ? $postData['article_id'] : 0; | ||
250 | + $postData['summary'] = isset($postData['summary']) ? $postData['summary'] : ''; | ||
251 | + $postData['audio_at_ids'] = isset($postData['audio_at_ids']) ? $postData['audio_at_ids'] : ''; | ||
252 | + $postData['file_at_ids'] = isset($postData['file_at_ids']) ? $postData['file_at_ids'] : []; | ||
253 | + $postData['video_at_info'] = isset($postData['video_at_info']) ? $postData['video_at_info'] : []; | ||
254 | + $postData['link'] = isset($postData['link']) ? $postData['link'] : ''; | ||
255 | + $postData['is_jump'] = isset($postData['is_jump']) ? $postData['is_jump'] : Constant::NEWS_IS_JUMP_FALSE; | ||
256 | + | ||
257 | + return $postData; | ||
258 | + } | ||
259 | + | ||
260 | + /** | ||
261 | + * 校验传参 | ||
262 | + * @author liyifei | ||
263 | + * @param array $fixData 补全后的请求参数 | ||
264 | + * @return mixed | ||
265 | + */ | ||
266 | + private function _checkData($fixData) | ||
267 | + { | ||
268 | + // 为定时发布时,定时发布时间不能为空且大于当前时间 | ||
269 | + if ($fixData['news_status'] == Constant::NEWS_STATUS_TIMING_RELEASE) { | ||
270 | + if (!$fixData['cron_time'] || $fixData['cron_time'] <= MILLI_TIME) { | ||
271 | + E('_ERR_CREDIT_CRON_TIME_ERR'); | ||
272 | + } | ||
273 | + | ||
274 | + } | ||
275 | + // 文件最多上传5个 | ||
276 | + if (isset($fixData['file_at_ids']) && count($fixData['file_at_ids']) > Constant::UPLOAD_FILE_ATTACH_LIMIT) { | ||
277 | + | ||
278 | + E(L('_ERR_ARTICLE_FILE_ATTACH_MORE', ['at_type' => '文件'])); | ||
279 | + } | ||
280 | + | ||
281 | + // 音频最多上传5个 | ||
282 | + if (isset($fixData['audio_at_ids']) && count($fixData['audio_at_ids']) > Constant::UPLOAD_FILE_ATTACH_LIMIT) { | ||
283 | + | ||
284 | + E(L('_ERR_ARTICLE_FILE_ATTACH_MORE', ['at_type' => '音频'])); | ||
285 | + } | ||
286 | + | ||
287 | + // 视频最多上传5个 | ||
288 | + if (isset($fixData['video_at_info']) && count($fixData['video_at_info']) > Constant::UPLOAD_FILE_ATTACH_LIMIT) { | ||
289 | + | ||
290 | + E(L('_ERR_ARTICLE_FILE_ATTACH_MORE', ['at_type' => '视频'])); | ||
291 | + } | ||
292 | + | ||
293 | + // 视频附件参数不正确 | ||
294 | + if (!empty($fixData['video_at_info'])) { | ||
295 | + foreach ($fixData['video_at_info'] as $video) { | ||
296 | + if (!isset($video['at_id'], $video['at_name'], $video['at_size'], $video['at_time'])) { | ||
297 | + | ||
298 | + E('_ERR_ARTICLE_ATTACH_PARAM'); | ||
299 | + } | ||
300 | + } | ||
301 | + } | ||
302 | + | ||
303 | + // 保存自定义积分策略时,策略数据必传 | ||
304 | + $allow_key = [ | ||
305 | + 'action_key', | ||
306 | + 'strategy_id', | ||
307 | + ]; | ||
308 | + if ($fixData['strategy_setting'] == Constant::NEWS_STRATEGY_CUSTOM) { | ||
309 | + if (!isset($fixData['strategys']) || empty($fixData['strategys'])) { | ||
310 | + E('_ERR_ARTICLE_STRATEGY_ID_EMPTY'); | ||
311 | + } | ||
312 | + | ||
313 | + foreach ($fixData['strategys'] as $strategys) { | ||
314 | + if (!is_array($strategys) || empty($strategys)) { | ||
315 | + E('_ERR_ARTICLE_STRATEGY_PARAM_FORMAT'); | ||
316 | + } | ||
317 | + | ||
318 | + $strategy_key = array_keys($strategys); | ||
319 | + if (array_diff($allow_key, $strategy_key)) { | ||
320 | + E('_ERR_ARTICLE_STRATEGY_PARAM_LOSE'); | ||
321 | + } | ||
322 | + } | ||
323 | + } | ||
324 | + | ||
325 | + // 保存自定义学分策略时,策略数据必传 | ||
326 | + if ($fixData['credit_strategy_setting'] == Constant::NEWS_STRATEGY_CUSTOM) { | ||
327 | + if (!isset($fixData['credit_strategys']) || empty($fixData['credit_strategys'])) { | ||
328 | + E('_ERR_CREDIT_STRATEGY_ID_EMPTY'); | ||
329 | + } | ||
330 | + | ||
331 | + foreach ($fixData['credit_strategys'] as $credit_strategys) { | ||
332 | + if (!is_array($credit_strategys) || empty($credit_strategys)) { | ||
333 | + E('_ERR_CREDIT_STRATEGY_PARAM_FORMAT'); | ||
334 | + } | ||
335 | + | ||
336 | + $strategy_key = array_keys($credit_strategys); | ||
337 | + if (array_diff($allow_key, $strategy_key)) { | ||
338 | + E('_ERR_CREDIT_STRATEGY_PARAM_LOSE'); | ||
339 | + } | ||
340 | + } | ||
341 | + } | ||
342 | + | ||
343 | + return true; | ||
344 | + } | ||
345 | + | ||
346 | + /** | ||
347 | + * 补全写入article表的数据 | ||
348 | + * @author liyifei | ||
349 | + * @param array $fixData 补全后的请求参数 | ||
350 | + * @return array | ||
351 | + */ | ||
352 | + private function _fixSqlData($fixData) | ||
353 | + { | ||
354 | + // 补全data_id | ||
355 | + $articleServ = new ArticleService(); | ||
356 | + if ($fixData['article_id'] == 0) { | ||
357 | + | ||
358 | + $fixData['data_id'] = $articleServ->buildDataID(); | ||
359 | + } | ||
360 | + | ||
361 | + // 补全管理员信息 | ||
362 | + $fixData['ea_id'] = $this->_login->user['eaId']; | ||
363 | + $fixData['ea_name'] = $this->_login->user['eaRealname']; | ||
364 | + | ||
365 | + // 补全class_name | ||
366 | + $classServ = new ClassService(); | ||
367 | + $class = $classServ->get($fixData['class_id']); | ||
368 | + if (empty($class)) { | ||
369 | + E('_ERR_CLASS_DATA_NOT_FOUND'); | ||
370 | + } | ||
371 | + $fixData['class_name'] = $class['class_name']; | ||
372 | + | ||
373 | + // 补全summary | ||
374 | + if (empty($fixData['summary']) && !empty($fixData['content'])) { | ||
375 | + // 去除html格式,自动从内容中抓取54个字符 | ||
376 | + $content = htmlspecialchars(strip_tags($fixData['content'])); | ||
377 | + $fixData['summary'] = mb_substr($content, 0, Constant::AUTO_SUMMARY_LENGTH, 'UTF-8'); | ||
378 | + } | ||
379 | + | ||
380 | + // 补全cover_url | ||
381 | + $attachServ = &Attach::instance(); | ||
382 | + $fixData['cover_url'] = $attachServ->getAttachUrl($fixData['cover_id']); | ||
383 | + | ||
384 | + // 补全send_time | ||
385 | + $fixData['send_time'] = MILLI_TIME; | ||
386 | + | ||
387 | + // 补全news_status、convert_status | ||
388 | + $fixData['convert_status'] = Constant::FILE_STATUS_NORMAL; | ||
389 | + if ($fixData['news_status'] == Constant::NEWS_STATUS_SEND) { | ||
390 | + if ($fixData['article_id'] == 0) { | ||
391 | + // 新建新闻,有附件(预发布、转码中)(视频现在必须转码完成后才能提交,因此不会在保存后进行转码) | ||
392 | + if (!empty($fixData['file_at_ids'])) { | ||
393 | + $fixData['news_status'] = Constant::NEWS_STATUS_READY_SEND; | ||
394 | + $fixData['convert_status'] = Constant::FILE_STATUS_CONVERT; | ||
395 | + } | ||
396 | + | ||
397 | + } else { | ||
398 | + $article = $articleServ->get($fixData['article_id']); | ||
399 | + if (empty($article)) { | ||
400 | + E('_ERR_ARTICLE_NOT_FOUND'); | ||
401 | + } | ||
402 | + // 原草稿->现已发布,有附件(预发布、转码中)(视频现在必须转码完成后才能提交,因此不会在保存后进行转码) | ||
403 | + if ($article['news_status'] == Constant::NEWS_STATUS_DRAFT && (!empty($fixData['file_at_ids']))) { | ||
404 | + $fixData['news_status'] = Constant::NEWS_STATUS_READY_SEND; | ||
405 | + $fixData['convert_status'] = Constant::FILE_STATUS_CONVERT; | ||
406 | + } | ||
407 | + // 原已发布->现已发布(不修改附件) | ||
408 | + if ($article['news_status'] == Constant::NEWS_STATUS_SEND) { | ||
409 | + $fixData['news_status'] = Constant::NEWS_STATUS_SEND; | ||
410 | + $fixData['convert_status'] = Constant::FILE_STATUS_NORMAL; | ||
411 | + } | ||
412 | + } | ||
413 | + } | ||
414 | + | ||
415 | + // 序列化存储积分策略数据 | ||
416 | + if ($fixData['strategy_setting'] == Constant::NEWS_STRATEGY_CUSTOM && !empty($fixData['strategys'])) { | ||
417 | + $strategys = []; | ||
418 | + foreach ($fixData['strategys'] as $v) { | ||
419 | + $action_key = $v['action_key']; | ||
420 | + $strategys[$action_key] = $v['strategy_id']; | ||
421 | + } | ||
422 | + $fixData['strategys'] = serialize($strategys); | ||
423 | + } else { | ||
424 | + $fixData['strategys'] = ''; | ||
425 | + } | ||
426 | + | ||
427 | + // 序列化存储学分策略数据 | ||
428 | + if ($fixData['credit_strategy_setting'] == Constant::NEWS_STRATEGY_CUSTOM && !empty($fixData['credit_strategys'])) { | ||
429 | + $strategys = []; | ||
430 | + foreach ($fixData['credit_strategys'] as $v) { | ||
431 | + $action_key = $v['action_key']; | ||
432 | + $strategys[$action_key] = $v['strategy_id']; | ||
433 | + } | ||
434 | + $fixData['credit_strategys'] = serialize($strategys); | ||
435 | + } else { | ||
436 | + $fixData['credit_strategys'] = ''; | ||
437 | + } | ||
438 | + | ||
439 | + // 去掉postData请求参数中,不在article主表中的字段 | ||
440 | + $removeKeys = [ | ||
441 | + 'article_id', | ||
442 | + 'audio_at_ids', | ||
443 | + 'file_at_ids', | ||
444 | + 'video_at_info', | ||
445 | + 'right', | ||
446 | + ]; | ||
447 | + foreach ($fixData as $k => $v) { | ||
448 | + if (in_array($k, $removeKeys)) { | ||
449 | + unset($fixData[$k]); | ||
450 | + } | ||
451 | + } | ||
452 | + | ||
453 | + return $fixData; | ||
454 | + } | ||
455 | + | ||
456 | + /** | ||
457 | + * @desc 更新数据时,数据库与提交数据对比,判断推送接口 | ||
458 | + * @author tangxingguo | ||
459 | + * @param int $article_id 新闻ID | ||
460 | + * @param array $newInfo 更新的新闻数据 | ||
461 | + * @param array $postRight 用户提交的权限数据 | ||
462 | + */ | ||
463 | + private function _operationRpc($article_id, $newInfo, $postRight) | ||
464 | + { | ||
465 | + $articleServ = new ArticleService(); | ||
466 | + $articleDBInfo = $articleServ->get($article_id); | ||
467 | + if (($articleDBInfo['is_recommend'] == Constant::NEWS_IS_RECOMMEND_TRUE && $newInfo['is_recommend'] == Constant::NEWS_IS_RECOMMEND_FALSE) || ($articleDBInfo['is_recommend'] == Constant::NEWS_IS_RECOMMEND_TRUE && $newInfo['news_status'] == Constant::NEWS_STATUS_READY_SEND)) { | ||
468 | + // 有推送过取消推送 或 计划任务,删除接口 | ||
469 | + $articleServ->delNewsRpc($article_id); | ||
470 | + } elseif ($articleDBInfo['is_recommend'] == Constant::NEWS_IS_RECOMMEND_FALSE && $newInfo['is_recommend'] == Constant::NEWS_IS_RECOMMEND_TRUE) { | ||
471 | + // 第一次推送,添加接口 | ||
472 | + $articleServ->addNewsRpc($article_id, $postRight); | ||
473 | + } elseif ($articleDBInfo['is_recommend'] == Constant::NEWS_IS_RECOMMEND_TRUE && $newInfo['is_recommend'] == Constant::NEWS_IS_RECOMMEND_TRUE) { | ||
474 | + // 有推送过,更新接口 | ||
475 | + $articleServ->updateNewsRpc($article_id, $newInfo, $postRight); | ||
476 | + } | ||
477 | + } | ||
478 | +} |
trunk/Message/Apicp/Controller/News/TopController.class.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: liyifei2012it | ||
5 | + * Date: 17/4/11 | ||
6 | + * Time: 18:16 | ||
7 | + */ | ||
8 | +namespace Apicp\Controller\News; | ||
9 | + | ||
10 | +use Com\PackageValidate; | ||
11 | +use Common\Service\ArticleService; | ||
12 | + | ||
13 | +class TopController extends \Apicp\Controller\AbstractController | ||
14 | +{ | ||
15 | + /** | ||
16 | + | ||
17 | + * Top | ||
18 | + * | ||
19 | + * @author zhonglei | ||
20 | + | ||
21 | + * @desc 新闻置顶/取消置顶 | ||
22 | + | ||
23 | + * @param Int article_id:true 新闻ID | ||
24 | + | ||
25 | + * @return mixed | ||
26 | + | ||
27 | + */ | ||
28 | + public function Index_post() | ||
29 | + { | ||
30 | + // 验证规则 | ||
31 | + $rules = [ | ||
32 | + 'article_id' => 'require|integer', | ||
33 | + ]; | ||
34 | + | ||
35 | + // 验证数据 | ||
36 | + $validate = new PackageValidate($rules, [], array_keys($rules)); | ||
37 | + $postData = $validate->postData; | ||
38 | + $article_id = $postData['article_id']; | ||
39 | + | ||
40 | + $artServ = new ArticleService(); | ||
41 | + $article = $artServ->get($article_id); | ||
42 | + | ||
43 | + if (empty($article)) { | ||
44 | + E('_ERR_ARTICLE_NOT_FOUND'); | ||
45 | + } | ||
46 | + | ||
47 | + $top_time = $article['top_time'] > 0 ? 0 : MILLI_TIME; | ||
48 | + $artServ->update($article_id, ['top_time' => $top_time]); | ||
49 | + } | ||
50 | +} |
trunk/Message/Apicp/Controller/News/UpdateUnreadController.class.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: liyifei2012it | ||
5 | + * Date: 17/4/11 | ||
6 | + * Time: 19:12 | ||
7 | + */ | ||
8 | +namespace Apicp\Controller\News; | ||
9 | + | ||
10 | +use Com\PackageValidate; | ||
11 | +use Common\Common\Constant; | ||
12 | +use Common\Common\NewsHelper; | ||
13 | +use Common\Service\ArticleService; | ||
14 | + | ||
15 | +class UpdateUnreadController extends \Apicp\Controller\AbstractController | ||
16 | +{ | ||
17 | + /** | ||
18 | + * UpdateUnread | ||
19 | + * @author zhonglei | ||
20 | + * @desc 更新未读总数 | ||
21 | + * @param Array article_ids:true 新闻ID数组 | ||
22 | + * @return mixed | ||
23 | + */ | ||
24 | + public function Index_post() | ||
25 | + { | ||
26 | + // 验证规则 | ||
27 | + $rules = [ | ||
28 | + 'article_ids' => 'require|array', | ||
29 | + ]; | ||
30 | + | ||
31 | + // 验证数据 | ||
32 | + $validate = new PackageValidate($rules, [], array_keys($rules)); | ||
33 | + $postData = $validate->postData; | ||
34 | + $article_ids = $postData['article_ids']; | ||
35 | + | ||
36 | + $artServ = new ArticleService(); | ||
37 | + $list = $artServ->list_by_conds([ | ||
38 | + 'article_id' => $article_ids, | ||
39 | + 'update_time < ?' => MILLI_TIME - Constant::NEWS_UNREAD_TIME, | ||
40 | + ]); | ||
41 | + | ||
42 | + if (empty($list)) { | ||
43 | + return true; | ||
44 | + } | ||
45 | + | ||
46 | + $newsHelper = &NewsHelper::instance(); | ||
47 | + | ||
48 | + foreach ($list as $article) { | ||
49 | + list(, $uids_read, $uids_unread) = $newsHelper->getReadData($article['article_id']); | ||
50 | + $unread_total = count($uids_unread); | ||
51 | + $read_total = count($uids_read); | ||
52 | + if ($article['unread_total'] != $unread_total || $article['read_total'] != $read_total) { | ||
53 | + $artServ->update($article['article_id'], [ | ||
54 | + 'unread_total' => $unread_total, | ||
55 | + 'read_total' => $read_total, | ||
56 | + 'update_time' => MILLI_TIME, | ||
57 | + ]); | ||
58 | + } | ||
59 | + } | ||
60 | + } | ||
61 | +} |
trunk/Message/Apicp/Controller/News/VideoInfoController.class.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: liyifei2012it | ||
5 | + * Date: 17/9/20 | ||
6 | + * Time: 15:05 | ||
7 | + */ | ||
8 | +namespace Apicp\Controller\News; | ||
9 | + | ||
10 | +use VcySDK\Service; | ||
11 | +use VcySDK\FileConvert; | ||
12 | + | ||
13 | +class VideoInfoController extends \Apicp\Controller\AbstractController | ||
14 | +{ | ||
15 | + /** | ||
16 | + * VideoInfo | ||
17 | + * @author liyifei | ||
18 | + * @desc 视频详情 | ||
19 | + * @param String at_id 视频附件ID | ||
20 | + * @return array | ||
21 | + array( | ||
22 | + 'coverUrl' => 'http://1251064102.vod2.myqcloud.com/3f09017dvodtransgzp1251064102/a1c2a89f9031868223244026455/snapshot/1505805642_4281657565.100_0.jpg', // 封面地址(5秒内会生成) | ||
23 | + 'sd' =>'http://1251064102.vod2.myqcloud.com/3f09017dvodtransgzp1251064102/a1c2a89f9031868223244026455/v.f20.mp4', // 标清 (如果值为空,说明腾讯云后台还在转码中) | ||
24 | + 'default' =>'http://1251064102.vod2.myqcloud.com/8ae15ed5vodgzp1251064102/a1c2a89f9031868223244026455/f0.avi', // 原始视频 (实时,上传视频成功之后就会有) | ||
25 | + 'url' =>'http://1251064102.vod2.myqcloud.com/3f09017dvodtransgzp1251064102/a1c2a89f9031868223244026455/v.f20.mp4', // 播放地址 (如果值为空,说明腾讯云后台还在转码中, 下次迭代会删除此参数,建议使用sd代替) | ||
26 | + 'fileId' =>'9031868223244026455', // 视频fileId | ||
27 | + ) | ||
28 | + */ | ||
29 | + public function Index() | ||
30 | + { | ||
31 | + $atId = I('post.at_id', '', 'trim'); | ||
32 | + if (empty($atId)) { | ||
33 | + E('_ERR_VIDEO_ID_IS_EMPTY'); | ||
34 | + } | ||
35 | + | ||
36 | + $convertServ = new FileConvert(Service::instance()); | ||
37 | + $videoInfo = $convertServ->getVodPlayUrl($atId); | ||
38 | + | ||
39 | + $videoInfo['sd'] = $videoInfo['sd'] ?? ''; | ||
40 | + $videoInfo['hd'] = $videoInfo['hd'] ?? ''; | ||
41 | + $videoInfo['coverUrl'] = $videoInfo['coverUrl'] ?? ''; | ||
42 | + | ||
43 | + $this->_result = $videoInfo; | ||
44 | + } | ||
45 | +} |
trunk/Message/Apicp/Controller/NewsClass/DeleteController.class.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: tangxingguo | ||
5 | + * Date: 2017/4/11 | ||
6 | + * Time: 18:36 | ||
7 | + */ | ||
8 | +namespace Apicp\Controller\NewsClass; | ||
9 | + | ||
10 | +use Com\PackageValidate; | ||
11 | +use Common\Service\ArticleService; | ||
12 | +use Common\Service\ClassService; | ||
13 | + | ||
14 | +class DeleteController extends \Apicp\Controller\AbstractController | ||
15 | +{ | ||
16 | + /** | ||
17 | + * Delete | ||
18 | + * @author tangxingguo | ||
19 | + * @desc 删除分类 | ||
20 | + * @param int class_id:true 分类ID | ||
21 | + * @return null | ||
22 | + */ | ||
23 | + public function Index_post() | ||
24 | + { | ||
25 | + // 验证规则 | ||
26 | + $rules = [ | ||
27 | + 'class_id' => 'require|integer', | ||
28 | + ]; | ||
29 | + | ||
30 | + // 验证数据 | ||
31 | + $validate = new PackageValidate($rules, [], array_keys($rules)); | ||
32 | + $postData = $validate->postData; | ||
33 | + | ||
34 | + $classServ = new ClassService(); | ||
35 | + $classInfo = $classServ->get($postData['class_id']); | ||
36 | + if (empty($classInfo)) { | ||
37 | + E('_ERR_CLASS_DATA_NOT_FOUND'); | ||
38 | + } | ||
39 | + | ||
40 | + // 一级分类检查有无子分类 | ||
41 | + if ($classInfo['parent_id'] == 0) { | ||
42 | + $child = $classServ->get_by_conds(['parent_id' => $classInfo['class_id']]); | ||
43 | + if ($child) { | ||
44 | + E('_ERR_CLASS_CONTAIN_CHILD'); | ||
45 | + } | ||
46 | + } | ||
47 | + | ||
48 | + // 检查分类下有无新闻 | ||
49 | + $articleServ = new ArticleService(); | ||
50 | + $articleCount = $articleServ->count_by_conds(['class_id' => $postData['class_id']]); | ||
51 | + if ($articleCount > 0) { | ||
52 | + E('_ERR_CLASS_CONTAIN_ARTICLE'); | ||
53 | + } | ||
54 | + | ||
55 | + // 删除分类 | ||
56 | + $classServ->delete($postData['class_id']); | ||
57 | + } | ||
58 | +} |
trunk/Message/Apicp/Controller/NewsClass/InfoController.class.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: tangxingguo | ||
5 | + * Date: 2017/4/13 | ||
6 | + * Time: 17:02 | ||
7 | + */ | ||
8 | +namespace Apicp\Controller\NewsClass; | ||
9 | + | ||
10 | +use Com\PackageValidate; | ||
11 | +use Common\Service\ClassService; | ||
12 | +use Common\Service\RightService; | ||
13 | + | ||
14 | +class InfoController extends \Apicp\Controller\AbstractController | ||
15 | +{ | ||
16 | + /** | ||
17 | + * Info | ||
18 | + * @author tangxingguo | ||
19 | + * @desc 分类详情 | ||
20 | + * @param int class_id:true 分类ID | ||
21 | + * @return array 分类信息 | ||
22 | + array ( | ||
23 | + 'class_id' => 2 // 当前分类ID | ||
24 | + 'parent_id' => 1 // 这是父级分类ID(仅二级分类存在) | ||
25 | + 'parent_name' => 分类1 // 这是父级分类名称(仅二级分类存在) | ||
26 | + 'class_name' => 分类标题 // 这是分类标题 | ||
27 | + 'description' => 分类描述 // 这是分类描述 | ||
28 | + 'is_open' => 1 // 启用分类(1=禁用,2=启用)(仅二级分类存在) | ||
29 | + 'right' => array( // 权限详情 | ||
30 | + 'is_all' => 1, // 是否全公司(1=否,2=是) | ||
31 | + 'tag_list' => array( // 标签信息(仅二级分类存在) | ||
32 | + 'tag_id' => '0E19B0B47F0000012652058BA42EEEDE', // 标签ID | ||
33 | + 'tag_name' => '吃货', // 标签名称 | ||
34 | + ), | ||
35 | + 'dp_list' => array( // 部门信息(仅二级分类存在) | ||
36 | + 'dp_id' => '0E19B0B47F0000012652058BA42EEEDE', // 部门ID | ||
37 | + 'dp_name' => '技术部', // 部门名称 | ||
38 | + ), | ||
39 | + 'user_list' => array( // 人员信息(仅二级分类存在) | ||
40 | + 'uid' => '0E19B0B47F0000012652058BA42EEEDE', // 人员ID | ||
41 | + 'username' => '张三', // 人员姓名 | ||
42 | + 'face' => 'http://qy.vchangyi.com', // 人员姓名 | ||
43 | + ), | ||
44 | + 'job_list' => array( // 职位(仅二级分类存在) | ||
45 | + array( | ||
46 | + 'job_id' => '62C316437F0000017AE8E6ACC7EFAC22', // 职位ID | ||
47 | + 'job_name' => '攻城狮', // 职位名称 | ||
48 | + ), | ||
49 | + ), | ||
50 | + 'role_list' => array( // 角色(仅二级分类存在) | ||
51 | + array( | ||
52 | + 'role_id' => '62C354B97F0000017AE8E6AC4FD6F429', // 角色ID | ||
53 | + 'role_name' => '国家元首', // 角色名称 | ||
54 | + ), | ||
55 | + ), | ||
56 | + ), | ||
57 | + ); | ||
58 | + */ | ||
59 | + public function Index_post() | ||
60 | + { | ||
61 | + // 验证规则 | ||
62 | + $rules = [ | ||
63 | + 'class_id' => 'require|integer', | ||
64 | + ]; | ||
65 | + | ||
66 | + // 验证数据 | ||
67 | + $validate = new PackageValidate($rules, [], array_keys($rules)); | ||
68 | + $postData = $validate->postData; | ||
69 | + | ||
70 | + $classServ = new ClassService(); | ||
71 | + $classInfo = $classServ->get($postData['class_id']); | ||
72 | + if (empty($classInfo)) { | ||
73 | + E('_ERR_CLASS_DATA_NOT_FOUND'); | ||
74 | + } | ||
75 | + $info = [ | ||
76 | + 'class_id' => $classInfo['class_id'], | ||
77 | + 'class_name' => $classInfo['class_name'], | ||
78 | + 'description' => $classInfo['description'], | ||
79 | + 'right' => [], | ||
80 | + ]; | ||
81 | + | ||
82 | + // 二级分类 | ||
83 | + $level = $classServ->classLevel($postData['class_id']); | ||
84 | + if ($level == 2) { | ||
85 | + $pInfo = $classServ->get($classInfo['parent_id']); | ||
86 | + if ($pInfo) { | ||
87 | + $info['parent_name'] = $pInfo['class_name']; | ||
88 | + $info['is_open'] = $classInfo['is_open']; | ||
89 | + } | ||
90 | + | ||
91 | + // 取权限 | ||
92 | + $rightServ = new RightService(); | ||
93 | + $right = $rightServ->getData(['class_id' => $postData['class_id']]); | ||
94 | + $info['right'] = $right; | ||
95 | + } | ||
96 | + | ||
97 | + $this->_result = $info; | ||
98 | + } | ||
99 | +} |
trunk/Message/Apicp/Controller/NewsClass/ListController.class.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: liyifei2012it | ||
5 | + * Date: 17/4/11 | ||
6 | + * Time: 16:31 | ||
7 | + */ | ||
8 | +namespace Apicp\Controller\NewsClass; | ||
9 | + | ||
10 | +use Com\PackageValidate; | ||
11 | +use Common\Common\Constant; | ||
12 | +use Common\Service\ClassService; | ||
13 | + | ||
14 | +class ListController extends \Apicp\Controller\AbstractController | ||
15 | +{ | ||
16 | + /** | ||
17 | + | ||
18 | + * List | ||
19 | + | ||
20 | + * @desc 分类列表 | ||
21 | + | ||
22 | + * @param int is_open 获取的分类启禁用类型(1=禁用,2=启用) | ||
23 | + | ||
24 | + * @return array | ||
25 | + | ||
26 | + * array( | ||
27 | + | ||
28 | + * 'list' => array( | ||
29 | + | ||
30 | + * array( | ||
31 | + | ||
32 | + * 'class_id' => 1, // 分类ID | ||
33 | + | ||
34 | + * 'class_name' => '分类1', // 分类名称 | ||
35 | + | ||
36 | + * 'is_open' => 1, // 启用分类(1=禁用,2=启用) | ||
37 | + | ||
38 | + * 'order' => 1, // 排序 | ||
39 | + | ||
40 | + * 'child' => array( // 子分类 | ||
41 | + | ||
42 | + * array( | ||
43 | + | ||
44 | + * 'class_id' => 2, // 分类ID | ||
45 | + | ||
46 | + * 'class_name' => '分类2', // 分类名称 | ||
47 | + | ||
48 | + * 'is_open' => 1, // 启用分类(1=禁用,2=启用) | ||
49 | + | ||
50 | + * 'order' => 1, // 排序 | ||
51 | + | ||
52 | + * ) | ||
53 | + | ||
54 | + * ) | ||
55 | + | ||
56 | + * ) | ||
57 | + | ||
58 | + * ) | ||
59 | + | ||
60 | + * ) | ||
61 | + | ||
62 | + */ | ||
63 | + public function Index_post() | ||
64 | + { | ||
65 | + // 验证规则 | ||
66 | + $rules = [ | ||
67 | + 'is_open' => 'integer', | ||
68 | + ]; | ||
69 | + | ||
70 | + // 验证数据 | ||
71 | + $validate = new PackageValidate($rules, [], array_keys($rules)); | ||
72 | + $postData = $validate->postData; | ||
73 | + | ||
74 | + $classServ = new ClassService(); | ||
75 | + | ||
76 | + // 排序规则 | ||
77 | + $order_option = ['`order`' => 'asc']; | ||
78 | + | ||
79 | + // 取一级分类 | ||
80 | + $classList = $classServ->list_by_conds(['parent_id' => 0], [], $order_option); | ||
81 | + if (empty($classList)) { | ||
82 | + return $this->_result = ['list' => []]; | ||
83 | + } | ||
84 | + | ||
85 | + // 取二级分类 | ||
86 | + if (isset($postData['is_open']) && in_array($postData['is_open'], [Constant::CLASS_IS_OPEN_FALSE, Constant::CLASS_IS_OPEN_TRUE])) { | ||
87 | + $conds = [ | ||
88 | + 'parent_id > ?' => 0, | ||
89 | + 'is_open' => $postData['is_open'], | ||
90 | + ]; | ||
91 | + $childList = $classServ->list_by_conds($conds, [], $order_option); | ||
92 | + } else { | ||
93 | + $childList = $classServ->list_by_conds(['parent_id > ?' => 0], [], $order_option); | ||
94 | + } | ||
95 | + | ||
96 | + | ||
97 | + // 组合数据 | ||
98 | + foreach ($classList as $k => $v) { | ||
99 | + if ($childList) { | ||
100 | + foreach ($childList as $index => $info) { | ||
101 | + if ($v['class_id'] == $info['parent_id']) { | ||
102 | + $classList[$k]['child'][] = $info; | ||
103 | + unset($childList[$index]); | ||
104 | + } | ||
105 | + } | ||
106 | + } | ||
107 | + } | ||
108 | + $this->_result = ['list' => $classList]; | ||
109 | + } | ||
110 | +} |
trunk/Message/Apicp/Controller/NewsClass/OpenController.class.php
0 → 100644
1 | +<?php | ||
2 | + | ||
3 | +namespace Apicp\Controller\NewsClass; | ||
4 | + | ||
5 | +use Com\PackageValidate; | ||
6 | +use Common\Service\ClassService; | ||
7 | + | ||
8 | +class OpenController extends \Apicp\Controller\AbstractController | ||
9 | +{ | ||
10 | + /** | ||
11 | + * class_id int 分类ID | ||
12 | + * is_open bool 开关 1:禁用 2:启用 | ||
13 | + * @return bool | ||
14 | + */ | ||
15 | + public function index() | ||
16 | + { | ||
17 | + // 验证规则 | ||
18 | + $rules = [ | ||
19 | + 'class_id' => 'require|integer', | ||
20 | + 'is_open' => 'require|integer', | ||
21 | + ]; | ||
22 | + | ||
23 | + // 验证数据 | ||
24 | + $validate = new PackageValidate($rules, [ | ||
25 | + 'class_id.require' => L('_ERR_PARAM_CAN_NOT_EMPTY', ['name' => '分类ID']), | ||
26 | + 'is_open.require' => L('_ERR_PARAM_CAN_NOT_EMPTY', ['name' => '开启禁用']) | ||
27 | + ], array_keys($rules)); | ||
28 | + $postData = $validate->postData; | ||
29 | + | ||
30 | + // 修改 | ||
31 | + $classServ = new ClassService(); | ||
32 | + $classServ->update($postData['class_id'], [ | ||
33 | + 'is_open' => $postData['is_open'] | ||
34 | + ]); | ||
35 | + | ||
36 | + return true; | ||
37 | + } | ||
38 | +} |
trunk/Message/Apicp/Controller/NewsClass/SaveController.class.php
0 → 100644
1 | +<?php | ||
2 | + | ||
3 | +namespace Apicp\Controller\NewsClass; | ||
4 | + | ||
5 | +use Com\PackageValidate; | ||
6 | +use Common\Service\ArticleService; | ||
7 | +use Common\Service\ClassService; | ||
8 | + | ||
9 | +class SaveController extends \Apicp\Controller\AbstractController | ||
10 | +{ | ||
11 | + /** | ||
12 | + * Save | ||
13 | + * @author tangxingguo | ||
14 | + * @desc 保存分类 | ||
15 | + * @param Int parent_id 上级分类ID(二级分类保存时必填) | ||
16 | + * @param Int class_id 分类ID | ||
17 | + * @param String class_name:true 分类标题 | ||
18 | + * @param String description 分类描述 | ||
19 | + * @return array | ||
20 | + */ | ||
21 | + public function Index_post() | ||
22 | + { | ||
23 | + // 验证规则 | ||
24 | + $rules = [ | ||
25 | + 'parent_id' => 'integer', | ||
26 | + 'class_id' => 'integer', | ||
27 | + 'class_name' => 'require|max:20', | ||
28 | + 'description' => 'max:120', | ||
29 | + 'is_open' => 'in:1,2', | ||
30 | + ]; | ||
31 | + | ||
32 | + // 验证数据 | ||
33 | + $validate = new PackageValidate($rules, [], array_keys($rules)); | ||
34 | + $postData = $validate->postData; | ||
35 | + | ||
36 | + // 分类信息初始化 | ||
37 | + $classServ = new ClassService(); | ||
38 | + $classInfo = [ | ||
39 | + 'class_name' => $postData['class_name'], | ||
40 | + 'description' => isset($postData['description']) ? $postData['description'] : '', | ||
41 | + 'is_open' => $postData['is_open'] | ||
42 | + ]; | ||
43 | + | ||
44 | + // 唯一分类名检查 | ||
45 | + if (!$classServ->uniqueName($classInfo['class_name'], $postData['class_id'])) { | ||
46 | + E('_ERR_CLASS_NAME_REPEAT'); | ||
47 | + } | ||
48 | + | ||
49 | + // 二级分类操作 | ||
50 | + if (isset($postData['parent_id'])) { | ||
51 | + if (!isset($postData['parent_id']) || empty($postData['parent_id'])) { | ||
52 | + E('_ERR_CLASS_PARENT_ID_EMPTY'); | ||
53 | + } | ||
54 | + $classInfo['parent_id'] = $postData['parent_id']; | ||
55 | + | ||
56 | + // 分类名改变,修改article内分类名称 | ||
57 | + if (isset($postData['class_id'])) { | ||
58 | + $class = $classServ->get($postData['class_id']); | ||
59 | + if ($class && $class['class_name'] != $postData['class_name']) { | ||
60 | + $articleServ = new ArticleService(); | ||
61 | + $articleServ->update_by_conds( | ||
62 | + [ | ||
63 | + 'class_id' => $postData['class_id']], | ||
64 | + [ | ||
65 | + 'class_name' => $postData['class_name'] | ||
66 | + ] | ||
67 | + ); | ||
68 | + } | ||
69 | + } | ||
70 | + } else { | ||
71 | + // 一级分类 默认开启 | ||
72 | + $classInfo['is_open'] = 2; | ||
73 | + } | ||
74 | + | ||
75 | + if (empty($postData['class_id'])) { | ||
76 | + // 保存 | ||
77 | + $postData['class_id'] = $classServ->insert($classInfo); | ||
78 | + } else { | ||
79 | + // 修改 | ||
80 | + $classServ->update($postData['class_id'], $classInfo); | ||
81 | + } | ||
82 | + } | ||
83 | +} |
trunk/Message/Apicp/Controller/NewsClass/UpdateOrderController.class.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: liyifei2012it | ||
5 | + * Date: 17/4/11 | ||
6 | + * Time: 19:16 | ||
7 | + */ | ||
8 | +namespace Apicp\Controller\NewsClass; | ||
9 | + | ||
10 | +use Com\PackageValidate; | ||
11 | +use Common\Service\ClassService; | ||
12 | + | ||
13 | +class UpdateOrderController extends \Apicp\Controller\AbstractController | ||
14 | +{ | ||
15 | + /** | ||
16 | + * UpdateOrder | ||
17 | + * @author tangxingguo | ||
18 | + * @desc 分类拖动排序 | ||
19 | + * @param int list[].class_id:true 一级分类ID | ||
20 | + * @param int list[].child[].class_id:true 二级分类ID | ||
21 | + * @return array | ||
22 | + */ | ||
23 | + public function Index_post() | ||
24 | + { | ||
25 | + // 验证规则 | ||
26 | + $rules = [ | ||
27 | + 'list' => 'require|array', | ||
28 | + ]; | ||
29 | + | ||
30 | + // 验证数据 | ||
31 | + $validate = new PackageValidate($rules, [], array_keys($rules)); | ||
32 | + $postData = $validate->postData; | ||
33 | + | ||
34 | + // 入库 | ||
35 | + $classServ = new ClassService(); | ||
36 | + $order = 0; | ||
37 | + foreach ($postData['list'] as $k => $v) { | ||
38 | + $classServ->update($v['class_id'], ['`order`' => $order]); | ||
39 | + $order ++; | ||
40 | + if (isset($v['child'])) { | ||
41 | + foreach ($v['child'] as $child) { | ||
42 | + $classServ->update($child['class_id'], ['`order`' => $order]); | ||
43 | + $order ++; | ||
44 | + } | ||
45 | + } | ||
46 | + } | ||
47 | + } | ||
48 | +} |
trunk/Message/Apicp/Controller/Operate/ClassListController.class.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: tangxingguo | ||
5 | + * Date: 2017/4/11 | ||
6 | + * Time: 18:36 | ||
7 | + */ | ||
8 | +namespace Apicp\Controller\Operate; | ||
9 | + | ||
10 | +use Common\Service\ClassService; | ||
11 | + | ||
12 | +class ClassListController extends \Apicp\Controller\AbstractController | ||
13 | +{ | ||
14 | + /** | ||
15 | + * Banner 分类选择接口 | ||
16 | + * @desc 用于首页 Banner 展示的接口 | ||
17 | + * @return array( | ||
18 | + * array( | ||
19 | + * 'id' => '分类 ID', // 分类 ID | ||
20 | + * 'name' => '分类名称', // 分类名称 | ||
21 | + * 'upId' => '上级分类 ID,为 0 则表示顶级' // 上级分类 ID,为 0 则表示顶级 | ||
22 | + * ), | ||
23 | + * array() | ||
24 | + * ) | ||
25 | + */ | ||
26 | + public function Index_post() | ||
27 | + { | ||
28 | + $classServ = new ClassService(); | ||
29 | + $classList = $classServ->list_all(); | ||
30 | + | ||
31 | + // 格式化数据 | ||
32 | + $res = []; | ||
33 | + if (!empty($classList)) { | ||
34 | + foreach ($classList as $k => $v) { | ||
35 | + $res[] = [ | ||
36 | + 'id' => $v['class_id'], | ||
37 | + 'name' => $v['class_name'], | ||
38 | + 'upId' => $v['parent_id'], | ||
39 | + ]; | ||
40 | + } | ||
41 | + } | ||
42 | + | ||
43 | + $this->_result = $res; | ||
44 | + } | ||
45 | +} |
trunk/Message/Apicp/Controller/Operate/IconApiController.class.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: tangxingguo | ||
5 | + * Date: 2017/4/11 | ||
6 | + * Time: 18:36 | ||
7 | + */ | ||
8 | +namespace Apicp\Controller\Operate; | ||
9 | + | ||
10 | +use Common\Service\ClassService; | ||
11 | + | ||
12 | +class IconApiController extends \Apicp\Controller\AbstractController | ||
13 | +{ | ||
14 | + /** | ||
15 | + * 栏目接口 | ||
16 | + * @desc 栏目接口 | ||
17 | + * @return array( | ||
18 | + * array( | ||
19 | + * 'id' => '分类 ID', // 分类 ID | ||
20 | + * 'name' => '分类名称', // 分类名称 | ||
21 | + * 'url' => '分类链接,如果为空,则表明该链接不可直接访问', // 分类链接,如果为空,则表明该链接不可直接访问 | ||
22 | + * 'upId' => '上级分类 ID,为 0 则表示顶级' // 上级分类 ID,为 0 则表示顶级 | ||
23 | + * ), | ||
24 | + * array() | ||
25 | + * ) | ||
26 | + */ | ||
27 | + public function Index_post() | ||
28 | + { | ||
29 | + $classServ = new ClassService(); | ||
30 | + $classList = $classServ->list_all(); | ||
31 | + | ||
32 | + // 格式化数据 | ||
33 | + $res = [ | ||
34 | + [ | ||
35 | + 'id' => 0, | ||
36 | + 'name' => '全部', | ||
37 | + 'url' => 'News/Frontend/Index/NewsList/Index?class_id=0', | ||
38 | + 'upId' => 0, | ||
39 | + ] | ||
40 | + ]; | ||
41 | + if (!empty($classList)) { | ||
42 | + foreach ($classList as $k => $v) { | ||
43 | + $res[] = [ | ||
44 | + 'id' => $v['class_id'], | ||
45 | + 'name' => $v['class_name'], | ||
46 | + // 只有一级分类可以直接跳转 | ||
47 | + 'url' => $v['parent_id'] == 0 ? 'News/Frontend/Index/NewsList/Index?class_id=' . $v['class_id'] : '', | ||
48 | + 'upId' => $v['parent_id'], | ||
49 | + ]; | ||
50 | + } | ||
51 | + } | ||
52 | + | ||
53 | + $this->_result = $res; | ||
54 | + } | ||
55 | +} |
trunk/Message/Apicp/Controller/Operate/NewsListController.class.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: tangxingguo | ||
5 | + * Date: 2017/4/11 | ||
6 | + * Time: 18:36 | ||
7 | + */ | ||
8 | +namespace Apicp\Controller\Operate; | ||
9 | + | ||
10 | +use Com\PackageValidate; | ||
11 | +use Common\Common\Constant; | ||
12 | +use Common\Service\ArticleService; | ||
13 | + | ||
14 | +class NewsListController extends \Apicp\Controller\AbstractController | ||
15 | +{ | ||
16 | + /** | ||
17 | + * Banner 新闻列表接口 | ||
18 | + * @desc 用于首页 Banner 新闻列表的接口 | ||
19 | + * @param integer categoryId:false 要列表的分类 Id,为空则请求全部 | ||
20 | + * @param integer limit:false:20 每页显示的数据条数 | ||
21 | + * @param integer page:false:1 当前请求的页码 | ||
22 | + * @return array( | ||
23 | + array( | ||
24 | + 'limit' => 20, // 每页显示的数据条数 | ||
25 | + 'page' => 1, // 当前请求的页码 | ||
26 | + 'total' => 20, // 数据总数 | ||
27 | + 'pages' => 1, // 页码总数 | ||
28 | + 'categoryId' => 1, // 当前请求的分类 ID | ||
29 | + 'list' => array( | ||
30 | + 'id' => '新闻 ID', // 新闻ID | ||
31 | + 'subject' => '新闻标题', // 新闻标题 | ||
32 | + 'time' => '发表时间', // 发表时间 | ||
33 | + 'categoryName' => '所属分类名称', // 分类名称 | ||
34 | + 'categoryId' => '所属分类 ID', // 分类ID | ||
35 | + 'author' => '作者名称', // 作者名称 | ||
36 | + ) | ||
37 | + ); | ||
38 | + */ | ||
39 | + public function Index_post() | ||
40 | + { | ||
41 | + // 验证规则 | ||
42 | + $rules = [ | ||
43 | + 'categoryId' => 'integer', | ||
44 | + 'limit' => 'integer', | ||
45 | + 'page' => 'integer', | ||
46 | + ]; | ||
47 | + | ||
48 | + // 验证数据 | ||
49 | + $validate = new PackageValidate($rules, [], array_keys($rules)); | ||
50 | + $postData = $validate->postData; | ||
51 | + | ||
52 | + // 默认值 | ||
53 | + $postData['page'] = isset($postData['page']) ? $postData['page'] : Constant::PAGING_DEFAULT_PAGE; | ||
54 | + $postData['limit'] = isset($postData['limit']) ? $postData['limit'] : Constant::PAGING_DEFAULT_LIMIT; | ||
55 | + | ||
56 | + // 组合条件 | ||
57 | + $conds = ['news_status' => Constant::NEWS_STATUS_SEND]; | ||
58 | + if (isset($postData['categoryId'])) { | ||
59 | + $conds['class_id'] = $postData['categoryId']; | ||
60 | + } | ||
61 | + | ||
62 | + // 分页 | ||
63 | + list($start, $perpage) = page_limit($postData['page'], $postData['limit']); | ||
64 | + | ||
65 | + // 排序 | ||
66 | + $order_option = ['top_time' => 'desc', 'send_time' => 'desc']; | ||
67 | + | ||
68 | + // 列表 | ||
69 | + $articleServ = new ArticleService(); | ||
70 | + $list = $articleServ->list_by_conds($conds, [$start, $perpage], $order_option); | ||
71 | + $resList = []; | ||
72 | + if (!empty($list)) { | ||
73 | + foreach ($list as $v) { | ||
74 | + $resList[] = [ | ||
75 | + 'id' => $v['article_id'], | ||
76 | + 'subject' => $v['title'], | ||
77 | + 'time' => $v['send_time'], | ||
78 | + 'categoryName' => $v['class_name'], | ||
79 | + 'categoryId' => $v['class_id'], | ||
80 | + 'author' => $v['author'], | ||
81 | + ]; | ||
82 | + } | ||
83 | + } | ||
84 | + | ||
85 | + // 数据总数 | ||
86 | + $total = $articleServ->count_by_conds($conds); | ||
87 | + | ||
88 | + $this->_result = [ | ||
89 | + 'limit' => $postData['limit'], | ||
90 | + 'page' => $postData['page'], | ||
91 | + 'total' => intval($total), | ||
92 | + 'pages' => ceil($total/$postData['limit']), | ||
93 | + 'categoryId' => isset($postData['categoryId']) ? $postData['categoryId'] : 0, | ||
94 | + 'list' => $resList, | ||
95 | + ]; | ||
96 | + } | ||
97 | +} |
trunk/Message/Apicp/Controller/Operate/NewsSearchController.class.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: tangxingguo | ||
5 | + * Date: 2017/4/11 | ||
6 | + * Time: 18:36 | ||
7 | + */ | ||
8 | +namespace Apicp\Controller\Operate; | ||
9 | + | ||
10 | +use Com\PackageValidate; | ||
11 | +use Common\Common\Constant; | ||
12 | +use Common\Service\ArticleService; | ||
13 | +use Common\Service\ClassService; | ||
14 | + | ||
15 | +class NewsSearchController extends \Apicp\Controller\AbstractController | ||
16 | +{ | ||
17 | + /** | ||
18 | + * Banner 搜索新闻接口 | ||
19 | + * @desc 用于 Banner 选择器的新闻搜索接口 | ||
20 | + * @param string kw:false 待搜索的关键词,为空则返回全部 | ||
21 | + * @param integer categoryId:false 分类筛选 | ||
22 | + * @param integer limit:false:15 每页显示的数据条数 | ||
23 | + * @param integer page:false:1 当前请求的页码 | ||
24 | + * @return array( | ||
25 | + array( | ||
26 | + 'limit' => 20, // 每页显示的数据条数 | ||
27 | + 'page' => 1, // 当前请求的页码 | ||
28 | + 'total' => 20, // 数据总数 | ||
29 | + 'pages' => 1, // 页码总数 | ||
30 | + 'categoryId' => 1, // 当前请求的分类 ID | ||
31 | + 'list' => array( | ||
32 | + 'id' => '新闻 ID', // 新闻ID | ||
33 | + 'subject' => '新闻标题', // 新闻标题 | ||
34 | + 'time' => '发表时间', // 发表时间 | ||
35 | + 'categoryName' => '所属分类名称', // 分类名称 | ||
36 | + 'categoryId' => '所属分类 ID', // 分类ID | ||
37 | + 'author' => '作者名称', // 作者名称 | ||
38 | + ) | ||
39 | + ); | ||
40 | + */ | ||
41 | + public function Index_post() | ||
42 | + { | ||
43 | + // 验证规则 | ||
44 | + $rules = [ | ||
45 | + 'kw' => 'max:120', | ||
46 | + 'categoryId' => 'integer', | ||
47 | + 'limit' => 'integer', | ||
48 | + 'page' => 'integer', | ||
49 | + ]; | ||
50 | + | ||
51 | + // 验证数据 | ||
52 | + $validate = new PackageValidate($rules, [], array_keys($rules)); | ||
53 | + $postData = $validate->postData; | ||
54 | + | ||
55 | + // 默认值 | ||
56 | + $postData['page'] = isset($postData['page']) ? $postData['page'] : Constant::PAGING_DEFAULT_PAGE; | ||
57 | + $postData['limit'] = isset($postData['limit']) ? $postData['limit'] : Constant::PAGING_DEFAULT_LIMIT; | ||
58 | + | ||
59 | + // 组合条件 | ||
60 | + $conds = ['news_status' => Constant::NEWS_STATUS_SEND]; | ||
61 | + if (isset($postData['categoryId'])) { | ||
62 | + $conds['class_id'] = $postData['categoryId']; | ||
63 | + } | ||
64 | + if (isset($postData['kw'])) { | ||
65 | + $conds['title like ?'] = '%' . $postData['kw'] . '%'; | ||
66 | + } | ||
67 | + | ||
68 | + // 分页 | ||
69 | + list($start, $perpage) = page_limit($postData['page'], $postData['limit']); | ||
70 | + | ||
71 | + // 排序 | ||
72 | + $order_option = ['top_time' => 'desc', 'send_time' => 'desc']; | ||
73 | + | ||
74 | + // 列表 | ||
75 | + $articleServ = new ArticleService(); | ||
76 | + $list = $articleServ->list_by_conds($conds, [$start, $perpage], $order_option); | ||
77 | + $resList = []; | ||
78 | + if (!empty($list)) { | ||
79 | + // 取分类 | ||
80 | + $classServ = new ClassService(); | ||
81 | + $classList = $classServ->list_all(); | ||
82 | + if (!empty($classList)) { | ||
83 | + $classList = array_combine_by_key($classList, 'class_id'); | ||
84 | + } | ||
85 | + | ||
86 | + // 格式化数据 | ||
87 | + foreach ($list as $v) { | ||
88 | + $resList[] = [ | ||
89 | + 'id' => $v['article_id'], | ||
90 | + 'subject' => $v['title'], | ||
91 | + 'time' => $v['send_time'], | ||
92 | + 'categoryName' => $v['class_name'], | ||
93 | + 'categoryId' => $v['class_id'], | ||
94 | + 'author' => $v['author'], | ||
95 | + 'attachId' => $v['cover_id'], | ||
96 | + 'url' => 'News/Frontend/Index/Detail/Index?article_id=' . $v['article_id'], | ||
97 | + 'category' => isset($classList) ? $this->_getCategory($v['class_id'], $classList) : [], | ||
98 | + ]; | ||
99 | + } | ||
100 | + } | ||
101 | + | ||
102 | + // 数据总数 | ||
103 | + $total = $articleServ->count_by_conds($conds); | ||
104 | + | ||
105 | + $this->_result = [ | ||
106 | + 'limit' => $postData['limit'], | ||
107 | + 'page' => $postData['page'], | ||
108 | + 'total' => intval($total), | ||
109 | + 'pages' => ceil($total/$postData['limit']), | ||
110 | + 'categoryId' => isset($postData['categoryId']) ? $postData['categoryId'] : 0, | ||
111 | + 'list' => $resList, | ||
112 | + ]; | ||
113 | + } | ||
114 | + | ||
115 | + /** | ||
116 | + * @desc 根据分类ID取出当前分类以及父级分类信息 | ||
117 | + * @author tangxingguo | ||
118 | + * @param int $classId 分类ID | ||
119 | + * @param array $classList 分类列表 | ||
120 | + * @return array | ||
121 | + */ | ||
122 | + private function _getCategory($classId, $classList) | ||
123 | + { | ||
124 | + $category = []; | ||
125 | + while (isset($classList[$classId]) && $classId != 0) { | ||
126 | + $category[] = [ | ||
127 | + 'id' => $classId, | ||
128 | + 'name' => $classList[$classId]['class_name'], | ||
129 | + 'upId' => $classList[$classId]['parent_id'], | ||
130 | + 'url' => $classList[$classId]['parent_id'] == 0 ? frontUrl('/app/page/news/list/list', ['class_id' => $classId]) : '', | ||
131 | + ]; | ||
132 | + $classId = $classList[$classId]['parent_id']; | ||
133 | + } | ||
134 | + return $category; | ||
135 | + } | ||
136 | +} |
trunk/Message/Apicp/Controller/index.html
0 → 100644
No preview for this file type
trunk/Message/Apicp/Lang/index.html
0 → 100644
No preview for this file type
trunk/Message/Apicp/Lang/zh-cn.php
0 → 100644
1 | +<?php | ||
2 | + | ||
3 | +return array( | ||
4 | + '_ERR_TEST' => '2014001:错误码示例', | ||
5 | + '_ERR_CLASS_DATA_NOT_FOUND' => '2014002:分类数据不存在', | ||
6 | + '_ERR_CLASS_CONTAIN_CHILD' => '2014003:分类内存在二级分类,无法删除', | ||
7 | + '_ERR_CLASS_NAME_REPEAT' => '2014004:分类名重复', | ||
8 | + '_ERR_CLASS_PARENT_ID_EMPTY' => '2014005:一级分类ID不能为空', | ||
9 | + '_ERR_CLASS_IS_OPEN_EMPTY' => '2014006:是否启用不能为空', | ||
10 | + '_ERR_CLASS_RIGHT_EMPTY' => '2014007:权限数据不能为空', | ||
11 | + '_ERR_ARTICLE_NOT_FOUND' => '2014008:头条不存在', | ||
12 | + '_ERR_ARTICLE_ID_EMPTY' => '2014009:头条ID不能为空', | ||
13 | + '_ERR_CLASS_CONTAIN_ARTICLE' => '2014010:分类内存在头条内容,不能被删除', | ||
14 | + '_ERR_ARTICLE_FILE_ATTACH_MORE' => '2014011:{$at_type}最多上传5个', | ||
15 | + '_ERR_ARTICLE_STATUS_FAIL' => '2014012:预发布与草稿不能发送未读提醒', | ||
16 | + '_ERR_ARTICLE_ATTACH_PARAM' => '2014013:视频附件参数不正确', | ||
17 | + '_ERR_ARTICLE_RIGHT_PARAM' => '2014014:阅读权限参数不正确', | ||
18 | + '_ERR_ARTICLE_DATA_ID_NOT_FOUND' => '2014015:数据标识不能为空', | ||
19 | + '_ERR_ARTICLE_STRATEGY_ID_EMPTY' => '2014016:积分策略ID不可为空', | ||
20 | + '_ERR_ARTICLE_STRATEGY_PARAM_FORMAT' => '2014017:积分策略数据格式错误', | ||
21 | + '_ERR_ARTICLE_STRATEGY_PARAM_LOSE' => '2014018:积分策略数据缺少参数', | ||
22 | + '_ERR_ARTICLE_SAVE_FAILED' => '2014019:头条保存失败,请稍后再试', | ||
23 | + '_ERR_VIDEO_ID_IS_EMPTY' => '2014020:视频ID不能为空', | ||
24 | + '_ERR_PARAM_CAN_NOT_EMPTY' => '2014021:{$name}不能为空', | ||
25 | + '_ERR_CREDIT_STRATEGY_ID_EMPTY' => '2014022:学分策略ID不可为空', | ||
26 | + '_ERR_CREDIT_STRATEGY_PARAM_FORMAT' => '2014023:学分策略数据格式错误', | ||
27 | + '_ERR_CREDIT_STRATEGY_PARAM_LOSE' => '2014024:学分策略数据缺少参数', | ||
28 | + '_ERR_CREDIT_CRON_TIME_ERR' => '2014025:定时发布时间有误', | ||
29 | +); |
trunk/Message/Common/Cli/Index.php
0 → 100644
1 | +<?php | ||
2 | +// +---------------------------------------------------------------------- | ||
3 | +// | ThinkPHP [ WE CAN DO IT JUST THINK ] | ||
4 | +// +---------------------------------------------------------------------- | ||
5 | +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. | ||
6 | +// +---------------------------------------------------------------------- | ||
7 | +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) | ||
8 | +// +---------------------------------------------------------------------- | ||
9 | +// | Author: liu21st <liu21st@gmail.com> | ||
10 | +// +---------------------------------------------------------------------- | ||
11 | + | ||
12 | +// 应用入口文件 | ||
13 | + | ||
14 | +// 检测PHP环境 | ||
15 | +if (version_compare(PHP_VERSION, '5.4.0', '<')) { | ||
16 | + die('require PHP > 5.4.0 !'); | ||
17 | +} | ||
18 | + | ||
19 | +// 开启调试模式 建议开发阶段开启 部署阶段注释或者设为false | ||
20 | +define('APP_DEBUG', true); | ||
21 | + | ||
22 | +// 绑定 Action 方法名称 | ||
23 | +// define('BIND_ACTION', 'execute'); | ||
24 | +// 绑定模块到当前文件 | ||
25 | +define('BIND_MODULE', 'Cli'); | ||
26 | + | ||
27 | +$depr = '/'; | ||
28 | +$path = isset($_SERVER['argv'][1]) ? $_SERVER['argv'][1] : ''; | ||
29 | +if (! empty($path)) { | ||
30 | + $params = explode($depr, trim($path, $depr)); | ||
31 | +} | ||
32 | + | ||
33 | +// !empty($params) ? $_GET['m'] = array_shift($params) : ""; | ||
34 | +! empty($params) ? $_GET['c'] = array_shift($params) : ""; | ||
35 | +! empty($params) ? $_GET['a'] = array_shift($params) : ""; | ||
36 | + | ||
37 | +// 解析剩余参数, 并采用 GET 方式获取 | ||
38 | +$params_ct = count($params); | ||
39 | +for ($i = 1; $i + 1 < $params_ct; $i += 2) { | ||
40 | + $_GET[$params[$i]] = $params[$i + 1]; | ||
41 | +} | ||
42 | + | ||
43 | +set_time_limit(0); | ||
44 | +// 框架目录 | ||
45 | +define('THINK_PATH', dirname(dirname(dirname(dirname(dirname(__FILE__))))) . '/thinkphp/ThinkPHP/'); | ||
46 | +// 定义应用目录 | ||
47 | +define('APP_PATH', dirname(dirname(dirname(dirname(dirname(__FILE__))))) . '/thinkphp/Apps/'); | ||
48 | + | ||
49 | +// 引入ThinkPHP入口文件 | ||
50 | +require THINK_PATH . 'ThinkPHP.php'; | ||
51 | + | ||
52 | +// 亲^_^ 后面不需要任何代码了 就是如此简单 |
trunk/Message/Common/Common/Constant.class.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: zhonglei | ||
5 | + * Date: 2017/3/20 | ||
6 | + * Time: 14:14 | ||
7 | + */ | ||
8 | + | ||
9 | +namespace Common\Common; | ||
10 | + | ||
11 | +class Constant | ||
12 | +{ | ||
13 | + /** | ||
14 | + * 允许下载文件上限:20M | ||
15 | + */ | ||
16 | + const DOWNLOAD_FILE_MAX_SIZE = 20 * 1024 * 1024; | ||
17 | + | ||
18 | + /** | ||
19 | + * 分页:默认页数 | ||
20 | + */ | ||
21 | + const PAGING_DEFAULT_PAGE = 1; | ||
22 | + | ||
23 | + /** | ||
24 | + * 分页:默认当前页数据总数 | ||
25 | + */ | ||
26 | + const PAGING_DEFAULT_LIMIT = 20; | ||
27 | + | ||
28 | + /** | ||
29 | + * 新闻未读总数刷新时间(2分钟) | ||
30 | + */ | ||
31 | + const NEWS_UNREAD_TIME = 60 * 1000 * 2; | ||
32 | + | ||
33 | + /** | ||
34 | + * 自动截取摘要长度:54字符 | ||
35 | + */ | ||
36 | + const AUTO_SUMMARY_LENGTH = 54; | ||
37 | + | ||
38 | + /** | ||
39 | + * 文件附件上传上限:5个 | ||
40 | + */ | ||
41 | + const UPLOAD_FILE_ATTACH_LIMIT = 5; | ||
42 | + | ||
43 | + /** | ||
44 | + * 启用分类:禁用 | ||
45 | + */ | ||
46 | + const CLASS_IS_OPEN_FALSE = 1; | ||
47 | + | ||
48 | + /** | ||
49 | + * 启用分类:启用 | ||
50 | + */ | ||
51 | + const CLASS_IS_OPEN_TRUE = 2; | ||
52 | + | ||
53 | + /** | ||
54 | + * 适用范围类型:分类 | ||
55 | + */ | ||
56 | + const RIGHT_CLASS_TYPE_CLASS = 1; | ||
57 | + | ||
58 | + /** | ||
59 | + * 适用范围类型:新闻 | ||
60 | + */ | ||
61 | + const RIGHT_CLASS_TYPE_NEWS = 2; | ||
62 | + | ||
63 | + /** | ||
64 | + * 适用范围是否全公司:否 | ||
65 | + */ | ||
66 | + const RIGHT_IS_ALL_FALSE = 1; | ||
67 | + | ||
68 | + /** | ||
69 | + * 适用范围是否全公司:是 | ||
70 | + */ | ||
71 | + const RIGHT_IS_ALL_TRUE = 2; | ||
72 | + | ||
73 | + /** | ||
74 | + * 权限类型:全公司 | ||
75 | + */ | ||
76 | + const RIGHT_TYPE_ALL = 1; | ||
77 | + | ||
78 | + /** | ||
79 | + * 权限类型:部门 | ||
80 | + */ | ||
81 | + const RIGHT_TYPE_DEPARTMENT = 2; | ||
82 | + | ||
83 | + /** | ||
84 | + * 权限类型:标签 | ||
85 | + */ | ||
86 | + const RIGHT_TYPE_TAG = 3; | ||
87 | + | ||
88 | + /** | ||
89 | + * 权限类型:人员 | ||
90 | + */ | ||
91 | + const RIGHT_TYPE_USER = 4; | ||
92 | + | ||
93 | + /** | ||
94 | + * 权限类型:职位 | ||
95 | + */ | ||
96 | + const RIGHT_TYPE_JOB = 5; | ||
97 | + | ||
98 | + /** | ||
99 | + * 权限类型:角色 | ||
100 | + */ | ||
101 | + const RIGHT_TYPE_ROLE = 6; | ||
102 | + | ||
103 | + /** | ||
104 | + * 是否正文显示封面图片:不显示 | ||
105 | + */ | ||
106 | + const NEWS_IS_SHOW_COVER_FALSE = 1; | ||
107 | + | ||
108 | + /** | ||
109 | + * 是否正文显示封面图片:显示 | ||
110 | + */ | ||
111 | + const NEWS_IS_SHOW_COVER_TRUE = 2; | ||
112 | + | ||
113 | + /** | ||
114 | + * 附件是否支持下载:不支持 | ||
115 | + */ | ||
116 | + const NEWS_IS_DOWNLOAD_FALSE = 1; | ||
117 | + | ||
118 | + /** | ||
119 | + * 附件是否支持下载:支持 | ||
120 | + */ | ||
121 | + const NEWS_IS_DOWNLOAD_TRUE = 2; | ||
122 | + | ||
123 | + /** | ||
124 | + * 是否保密:不保密 | ||
125 | + */ | ||
126 | + const NEWS_IS_SECRET_FALSE = 1; | ||
127 | + | ||
128 | + /** | ||
129 | + * 是否保密:保密 | ||
130 | + */ | ||
131 | + const NEWS_IS_SECRET_TRUE = 2; | ||
132 | + | ||
133 | + /** | ||
134 | + * 是否允许分享:不允许 | ||
135 | + */ | ||
136 | + const NEWS_IS_SHARE_FALSE = 1; | ||
137 | + | ||
138 | + /** | ||
139 | + * 是否允许分享:允许 | ||
140 | + */ | ||
141 | + const NEWS_IS_SHARE_TRUE = 2; | ||
142 | + | ||
143 | + /** | ||
144 | + * 消息通知:不开启 | ||
145 | + */ | ||
146 | + const NEWS_IS_NOTICE_FALSE = 1; | ||
147 | + | ||
148 | + /** | ||
149 | + * 消息通知:开启 | ||
150 | + */ | ||
151 | + const NEWS_IS_NOTICE_TRUE = 2; | ||
152 | + | ||
153 | + /** | ||
154 | + * 评论功能:不开启 | ||
155 | + */ | ||
156 | + const NEWS_IS_COMMENT_FALSE = 1; | ||
157 | + | ||
158 | + /** | ||
159 | + * 评论功能:开启 | ||
160 | + */ | ||
161 | + const NEWS_IS_COMMENT_TRUE = 2; | ||
162 | + | ||
163 | + /** | ||
164 | + * 点赞功能:不开启 | ||
165 | + */ | ||
166 | + const NEWS_IS_LIKE_FALSE = 1; | ||
167 | + | ||
168 | + /** | ||
169 | + * 点赞功能:开启 | ||
170 | + */ | ||
171 | + const NEWS_IS_LIKE_TRUE = 2; | ||
172 | + | ||
173 | + /** | ||
174 | + * 首页推荐:不开启 | ||
175 | + */ | ||
176 | + const NEWS_IS_RECOMMEND_FALSE = 1; | ||
177 | + | ||
178 | + /** | ||
179 | + * 首页推荐:开启 | ||
180 | + */ | ||
181 | + const NEWS_IS_RECOMMEND_TRUE = 2; | ||
182 | + | ||
183 | + /** | ||
184 | + * 新闻状态:草稿 | ||
185 | + */ | ||
186 | + const NEWS_STATUS_DRAFT = 1; | ||
187 | + | ||
188 | + /** | ||
189 | + * 新闻状态:已发布 | ||
190 | + */ | ||
191 | + const NEWS_STATUS_SEND = 2; | ||
192 | + | ||
193 | + /** | ||
194 | + * 新闻状态:预发布 | ||
195 | + */ | ||
196 | + const NEWS_STATUS_READY_SEND = 3; | ||
197 | + | ||
198 | + /** | ||
199 | + * 新闻状态:定时发布 | ||
200 | + */ | ||
201 | + const NEWS_STATUS_TIMING_RELEASE = 4; | ||
202 | + | ||
203 | + /** | ||
204 | + * 新闻转码状态:转码中 | ||
205 | + */ | ||
206 | + const FILE_STATUS_CONVERT = 1; | ||
207 | + | ||
208 | + /** | ||
209 | + * 新闻转码状态:转码成功 | ||
210 | + */ | ||
211 | + const FILE_STATUS_NORMAL = 2; | ||
212 | + | ||
213 | + /** | ||
214 | + * 新闻转码状态:转码失败 | ||
215 | + */ | ||
216 | + const FILE_STATUS_FAIL = 3; | ||
217 | + | ||
218 | + /** | ||
219 | + * 附件类型:视频 | ||
220 | + */ | ||
221 | + const ATTACH_TYPE_VIDEO = 1; | ||
222 | + | ||
223 | + /** | ||
224 | + * 附件类型:音频 | ||
225 | + */ | ||
226 | + const ATTACH_TYPE_AUDIO = 2; | ||
227 | + | ||
228 | + /** | ||
229 | + * 附件类型:其他 | ||
230 | + */ | ||
231 | + const ATTACH_TYPE_FILE = 3; | ||
232 | + | ||
233 | + /** | ||
234 | + * 阅读状态:已读 | ||
235 | + */ | ||
236 | + const READ_STATUS_IS_YES = 2; | ||
237 | + | ||
238 | + /** | ||
239 | + * 阅读状态:未读 | ||
240 | + */ | ||
241 | + const READ_STATUS_IS_NO = 1; | ||
242 | + | ||
243 | + /** | ||
244 | + * 点赞:对于新闻的点赞 | ||
245 | + */ | ||
246 | + const LIKE_TYPE_ARTICLE = 1; | ||
247 | + | ||
248 | + /** | ||
249 | + * 点赞:对于评论的点赞 | ||
250 | + */ | ||
251 | + const LIKE_TYPE_COMMENT = 2; | ||
252 | + | ||
253 | + /** | ||
254 | + * 评论操作类型:发表评论 | ||
255 | + */ | ||
256 | + const COMMENT_TYPE_ADD = 1; | ||
257 | + | ||
258 | + /** | ||
259 | + * 评论操作类型:删除评论 | ||
260 | + */ | ||
261 | + const COMMENT_TYPE_DELETE = 2; | ||
262 | + | ||
263 | + /** | ||
264 | + * 收藏操作类型:收藏 | ||
265 | + */ | ||
266 | + const FAVORITE_TYPE_ADD = 2; | ||
267 | + | ||
268 | + /** | ||
269 | + * 收藏操作类型:取消收藏 | ||
270 | + */ | ||
271 | + const FAVORITE_TYPE_DELETE = 1; | ||
272 | + | ||
273 | + /** | ||
274 | + * 是否外部人员:不是 | ||
275 | + */ | ||
276 | + const RIGHT_IS_OUTSIDE_NO = 1; | ||
277 | + | ||
278 | + /** | ||
279 | + * 是否外部人员:是 | ||
280 | + */ | ||
281 | + const RIGHT_IS_OUTSIDE_YES = 2; | ||
282 | + | ||
283 | + /** | ||
284 | + * 是否直接跳转外链:不直接跳转 | ||
285 | + */ | ||
286 | + const NEWS_IS_JUMP_FALSE = 1; | ||
287 | + | ||
288 | + /** | ||
289 | + * 是否直接跳转外链:直接跳转 | ||
290 | + */ | ||
291 | + const NEWS_IS_JUMP_TRUE = 2; | ||
292 | + | ||
293 | + /** | ||
294 | + * 是否是分享入口:不是 | ||
295 | + */ | ||
296 | + const RIGHT_INPUT_IS_SHARE_FALSE = 1; | ||
297 | + | ||
298 | + /** | ||
299 | + * 是否是分享入口:是 | ||
300 | + */ | ||
301 | + const RIGHT_INPUT_IS_SHARE_TRUE = 2; | ||
302 | + | ||
303 | + /** | ||
304 | + * 积分策略设置:启用默认策略 | ||
305 | + */ | ||
306 | + const NEWS_STRATEGY_DEFAULT = 1; | ||
307 | + | ||
308 | + /** | ||
309 | + * 积分策略设置:不启用策略 | ||
310 | + */ | ||
311 | + const NEWS_STRATEGY_DISABLE = 2; | ||
312 | + | ||
313 | + /** | ||
314 | + * 积分策略设置:自定义策略 | ||
315 | + */ | ||
316 | + const NEWS_STRATEGY_CUSTOM = 3; | ||
317 | + | ||
318 | + /** | ||
319 | + * 学分策略设置:启用默认策略 | ||
320 | + */ | ||
321 | + const NEWS_CREDIT_STRATEGY_DEFAULT = 1; | ||
322 | + | ||
323 | + /** | ||
324 | + * 学分策略设置:不启用策略 | ||
325 | + */ | ||
326 | + const NEWS_CREDIT_STRATEGY_DISABLE = 2; | ||
327 | + | ||
328 | + /** | ||
329 | + * 学分策略设置:自定义策略 | ||
330 | + */ | ||
331 | + const NEWS_CREDIT_STRATEGY_CUSTOM = 3; | ||
332 | + | ||
333 | + /** | ||
334 | + * 积分策略:业务应用Key | ||
335 | + */ | ||
336 | + const INT_APP_KEY = 'news_center'; | ||
337 | + | ||
338 | + /** | ||
339 | + * 积分策略行为Key:阅读 | ||
340 | + */ | ||
341 | + const INT_ACT_READ = 'read'; | ||
342 | + | ||
343 | + /** | ||
344 | + * 积分策略行为Key:评论 | ||
345 | + */ | ||
346 | + const INT_ACT_COMMENT = 'comment'; | ||
347 | + | ||
348 | + /** | ||
349 | + * 积分策略行为Key:分享 | ||
350 | + */ | ||
351 | + const INT_ACT_SHARED = 'shared'; | ||
352 | + | ||
353 | + /** | ||
354 | + * 积分策略行为Key:点赞 | ||
355 | + */ | ||
356 | + const INT_ACT_LIKE = 'like'; | ||
357 | + | ||
358 | + /** | ||
359 | + * 积分策略行为Key:收藏 | ||
360 | + */ | ||
361 | + const INT_ACT_COLLECT = 'collect'; | ||
362 | + | ||
363 | + /** | ||
364 | + * 积分触发规则Key:完成阅读 | ||
365 | + */ | ||
366 | + const INT_TRIGGER_COMPLETE = 'complete'; | ||
367 | + | ||
368 | + /** | ||
369 | + * 积分触发规则Key:完成阅读新闻篇数 | ||
370 | + */ | ||
371 | + const INT_TRIGGER_COMPLETE_NUM = 'complete_num'; | ||
372 | + | ||
373 | + /** | ||
374 | + * 积分触发规则Key:评论次数 | ||
375 | + */ | ||
376 | + const INT_TRIGGER_COMMENT = 'number'; | ||
377 | + | ||
378 | + /** | ||
379 | + * 积分触发规则Key:评论新闻篇数 | ||
380 | + */ | ||
381 | + const INT_TRIGGER_COMMENT_NUM = 'business_num'; | ||
382 | + | ||
383 | + /** | ||
384 | + * 积分触发规则Key:分享次数 | ||
385 | + */ | ||
386 | + const INT_TRIGGER_SHARED = 'shared_num'; | ||
387 | + | ||
388 | + /** | ||
389 | + * 积分触发规则Key:点赞次数 | ||
390 | + */ | ||
391 | + const INT_TRIGGER_LIKE = 'number'; | ||
392 | + | ||
393 | + /** | ||
394 | + * 积分触发规则Key:收藏次数 | ||
395 | + */ | ||
396 | + const INT_TRIGGER_COLLECT = 'collect_num'; | ||
397 | + | ||
398 | + /** | ||
399 | + * 任务中心action_key:阅读完成 | ||
400 | + */ | ||
401 | + const TASK_ACTION_KEY_NEWS_READ = 'news_read'; | ||
402 | + | ||
403 | +} |
trunk/Message/Common/Common/NewsHelper.class.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: liyifei2012it | ||
5 | + * Date: 17/6/6 | ||
6 | + * Time: 15:47 | ||
7 | + */ | ||
8 | +namespace Common\Common; | ||
9 | + | ||
10 | +use Common\Service\ReadService; | ||
11 | +use Common\Service\RightService; | ||
12 | + | ||
13 | +class NewsHelper | ||
14 | +{ | ||
15 | + /** | ||
16 | + * 实例化 | ||
17 | + * @author zhonglei | ||
18 | + * @return NewsHelper | ||
19 | + */ | ||
20 | + public static function &instance() | ||
21 | + { | ||
22 | + static $instance; | ||
23 | + | ||
24 | + if (is_null($instance)) { | ||
25 | + $instance = new self(); | ||
26 | + } | ||
27 | + | ||
28 | + return $instance; | ||
29 | + } | ||
30 | + | ||
31 | + /** | ||
32 | + * 发送新课程消息通知 | ||
33 | + * @author zhonglei | ||
34 | + * @param array $article 课程数据 | ||
35 | + * @param array $rights 权限数据 | ||
36 | + * @return bool | ||
37 | + */ | ||
38 | + public function sendNotice($article, $rights) | ||
39 | + { | ||
40 | + if (!is_array($article) || empty($article) || !is_array($rights) || empty($rights)) { | ||
41 | + return false; | ||
42 | + } | ||
43 | + | ||
44 | + $msgServ = &Msg::instance(); | ||
45 | + $msg_data = [ | ||
46 | + [ | ||
47 | + 'title' => "【{$article['class_name']}】{$article['title']}", | ||
48 | + 'description' => $article['summary'], | ||
49 | + 'url' => oaUrl('Frontend/Index/Detail/Index', ['article_id' => $article['article_id']]), | ||
50 | + 'picUrl' => $article['cover_url'], | ||
51 | + ] | ||
52 | + ]; | ||
53 | + | ||
54 | + // 全公司 | ||
55 | + if (isset($rights[Constant::RIGHT_TYPE_ALL]) && $rights[Constant::RIGHT_TYPE_ALL] == Constant::RIGHT_IS_ALL_TRUE) { | ||
56 | + $msgServ->sendNews('@all', null, null, $msg_data); | ||
57 | + | ||
58 | + // 其它 | ||
59 | + } else { | ||
60 | + $rightServ = new RightService(); | ||
61 | + $uids = $rightServ->getUidsByRight($rights); | ||
62 | + $uid_groups = array_chunk($uids, Msg::USER_MAX_COUNT); | ||
63 | + | ||
64 | + // 分批发送 | ||
65 | + foreach ($uid_groups as $uid_group) { | ||
66 | + $msgServ->sendNews($uid_group, null, null, $msg_data); | ||
67 | + } | ||
68 | + } | ||
69 | + | ||
70 | + return true; | ||
71 | + } | ||
72 | + | ||
73 | + /** | ||
74 | + * 发送未读提醒消息 | ||
75 | + * @author liyifei | ||
76 | + * @param array $uids 需要发送人员的UID一维数组 | ||
77 | + * @param array $article 新闻信息 | ||
78 | + * + string class_name 一级分类名称 | ||
79 | + * + string title 新闻标题 | ||
80 | + * + string cover_url 新闻封面地址 | ||
81 | + * + string article_id 新闻ID | ||
82 | + * + string summary 新闻摘要 | ||
83 | + * @return bool | ||
84 | + */ | ||
85 | + public function sendUnreadMsg($uids, $article) | ||
86 | + { | ||
87 | + if (empty($uids) || !isset($article['title'], $article['cover_url'], $article['article_id'], $article['summary'])) { | ||
88 | + return false; | ||
89 | + } | ||
90 | + | ||
91 | + $msgServ = &Msg::instance(); | ||
92 | + $msg_data = [ | ||
93 | + [ | ||
94 | + 'title' => "【{$article['class_name']}】{$article['title']}", | ||
95 | + 'description' => $article['summary'], | ||
96 | + 'url' => oaUrl('Frontend/Index/Detail/Index', ['article_id' => $article['article_id']]), | ||
97 | + 'picUrl' => $article['cover_url'], | ||
98 | + ] | ||
99 | + ]; | ||
100 | + | ||
101 | + // 分批发送 | ||
102 | + $uid_groups = array_chunk($uids, Msg::USER_MAX_COUNT); | ||
103 | + foreach ($uid_groups as $uid_group) { | ||
104 | + $msgServ->sendNews($uid_group, null, null, $msg_data); | ||
105 | + } | ||
106 | + | ||
107 | + return true; | ||
108 | + } | ||
109 | + | ||
110 | + /** | ||
111 | + * 获取新闻可读、已读、未读人员ID数组 | ||
112 | + * @author zhonglei | ||
113 | + * @param int $article_id 新闻ID | ||
114 | + * @return array [0 => 可读人员ID, 1 => 已读人员ID, 2 => 未读人员ID] | ||
115 | + */ | ||
116 | + public function getReadData($article_id, $uidCond = []) | ||
117 | + { | ||
118 | + $uids_all = []; | ||
119 | + $uids_read = []; | ||
120 | + $uids_unread = []; | ||
121 | + | ||
122 | + // 查询条件 | ||
123 | + $conds = ['article_id' => $article_id]; | ||
124 | + | ||
125 | + // 获取权限数据 | ||
126 | + $rightServ = new RightService(); | ||
127 | + $right_list = $rightServ->list_by_conds($conds); | ||
128 | + $rights = $rightServ->formatDBData($right_list); | ||
129 | + | ||
130 | + if (empty($rights)) { | ||
131 | + return [$uids_all, $uids_read, $uids_unread]; | ||
132 | + } | ||
133 | + | ||
134 | + // 获取可读数据 | ||
135 | + $uids_all = $rightServ->getUidsByRight($rights); | ||
136 | + if (!empty($uidCond)) { | ||
137 | + $uids_all = array_intersect($uidCond, $uids_all); | ||
138 | + } | ||
139 | + | ||
140 | + // 获取已读数据 | ||
141 | + $readServ = new ReadService(); | ||
142 | + if (!empty($uidCond)) { | ||
143 | + $conds['uid'] = $uidCond; | ||
144 | + } | ||
145 | + $study_list = $readServ->list_by_conds($conds); | ||
146 | + $uids_read = array_column($study_list, 'uid'); | ||
147 | + | ||
148 | + // 未读数据 | ||
149 | + $uids_unread = array_values(array_diff($uids_all, $uids_read)); | ||
150 | + return [$uids_all, $uids_read, $uids_unread]; | ||
151 | + } | ||
152 | + | ||
153 | + /** | ||
154 | + * @desc 格式化推送运营中心权限数据 | ||
155 | + * @author tangxingguo | ||
156 | + * @param array $postRight 用户提交的权限数据 | ||
157 | + * @return array | ||
158 | + */ | ||
159 | + public function formatRightForRPC($postRight) | ||
160 | + { | ||
161 | + $data = []; | ||
162 | + | ||
163 | + foreach ($postRight as $k => $v) { | ||
164 | + // 全公司 | ||
165 | + if ($k == 'is_all' && $v == Constant::RIGHT_IS_ALL_TRUE) { | ||
166 | + $data = []; | ||
167 | + break; | ||
168 | + } | ||
169 | + | ||
170 | + // 过滤空数组 | ||
171 | + if (!is_array($v) || empty($v)) { | ||
172 | + continue; | ||
173 | + } | ||
174 | + | ||
175 | + switch ($k) { | ||
176 | + // 部门 | ||
177 | + case 'dp_ids': | ||
178 | + $data['departments'] = $v; | ||
179 | + break; | ||
180 | + // 标签 | ||
181 | + case 'tag_ids': | ||
182 | + $data['tags'] = $v; | ||
183 | + break; | ||
184 | + // 人员 | ||
185 | + case 'uids': | ||
186 | + $data['users'] = $v; | ||
187 | + break; | ||
188 | + // 职位 | ||
189 | + case 'job_ids': | ||
190 | + $data['jobs'] = $v; | ||
191 | + break; | ||
192 | + // 角色 | ||
193 | + case 'role_ids': | ||
194 | + $data['roles'] = $v; | ||
195 | + break; | ||
196 | + } | ||
197 | + } | ||
198 | + | ||
199 | + return $data; | ||
200 | + } | ||
201 | + | ||
202 | + /** | ||
203 | + * 构造积分、学分触发参数 | ||
204 | + * @author zhonglei | ||
205 | + * @param array $article 新闻数据 | ||
206 | + * @param string $action_key 动作Key | ||
207 | + * @param array $trigger_types 触发规则 | ||
208 | + * @return array | ||
209 | + */ | ||
210 | + public function buildTrigger($article, $action_key, $trigger_types) | ||
211 | + { | ||
212 | + if (!\is_array($article) || !\is_array($trigger_types)) { | ||
213 | + return []; | ||
214 | + } | ||
215 | + | ||
216 | + if (!\is_array($article['strategys'])) { | ||
217 | + $article['strategys'] = empty($article['strategys']) ? [] : unserialize($article['strategys']); | ||
218 | + } | ||
219 | + | ||
220 | + if (!\is_array($article['credit_strategys'])) { | ||
221 | + $article['credit_strategys'] = empty($article['credit_strategys']) ? [] : unserialize($article['credit_strategys']); | ||
222 | + } | ||
223 | + | ||
224 | + $triggers = []; | ||
225 | + | ||
226 | + // 开启积分策略 | ||
227 | + if ($article['strategy_setting'] != Constant::NEWS_STRATEGY_DISABLE) { | ||
228 | + $strategy_id = ''; | ||
229 | + | ||
230 | + // 自定义积分策略 | ||
231 | + if ($article['strategy_setting'] == Constant::NEWS_STRATEGY_CUSTOM && isset($article['strategys'][$action_key])) { | ||
232 | + $strategy_id = $article['strategys'][$action_key]; | ||
233 | + } | ||
234 | + | ||
235 | + $triggers[] = [ | ||
236 | + 'miType' => IntegralStrategy::TRIGGER_TYPE_INTEGRAL, | ||
237 | + 'businessStrategyId' => $strategy_id, | ||
238 | + ]; | ||
239 | + } | ||
240 | + | ||
241 | + // 开启学分策略 | ||
242 | + if ($article['credit_strategy_setting'] != Constant::NEWS_STRATEGY_DISABLE) { | ||
243 | + $strategy_id = ''; | ||
244 | + | ||
245 | + // 自定义学分策略 | ||
246 | + if ($article['credit_strategy_setting'] == Constant::NEWS_STRATEGY_CUSTOM && isset($article['credit_strategys'][$action_key])) { | ||
247 | + $strategy_id = $article['credit_strategys'][$action_key]; | ||
248 | + } | ||
249 | + | ||
250 | + $triggers[] = [ | ||
251 | + 'miType' => IntegralStrategy::TRIGGER_TYPE_CREDIT, | ||
252 | + 'businessStrategyId' => $strategy_id, | ||
253 | + ]; | ||
254 | + } | ||
255 | + | ||
256 | + foreach ($triggers as $k => $trigger) { | ||
257 | + $triggers[$k]['triggerTypes'] = $trigger_types; | ||
258 | + } | ||
259 | + | ||
260 | + return $triggers; | ||
261 | + } | ||
262 | + | ||
263 | + /** | ||
264 | + * 格式化部门路径 | ||
265 | + * @author liyifei | ||
266 | + * @param array $user | ||
267 | + * @return string | ||
268 | + */ | ||
269 | + public function getDpPath($user) | ||
270 | + { | ||
271 | + // 部门列表 | ||
272 | + $deptServ = &Department::instance(); | ||
273 | + $deptList = $deptServ->listDepartmentFromSdk(); | ||
274 | + | ||
275 | + $dpPath = ''; | ||
276 | + $dpIds = array_column($user['dpName'], 'dpId'); | ||
277 | + foreach ($dpIds as $dpId) { | ||
278 | + $columnSuffix = end($dpIds) == $dpId ? '' : ";\n"; | ||
279 | + $dpPath .= $deptList[$dpId]['departmentPath'] . $columnSuffix; | ||
280 | + } | ||
281 | + | ||
282 | + return $dpPath; | ||
283 | + } | ||
284 | +} |
trunk/Message/Common/Common/RpcFavoriteHelper.class.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: liyifei2012it | ||
5 | + * Date: 17/6/7 | ||
6 | + * Time: 15:21 | ||
7 | + */ | ||
8 | +namespace Common\Common; | ||
9 | + | ||
10 | +class RpcFavoriteHelper | ||
11 | +{ | ||
12 | + /** | ||
13 | + * 是否收藏:未收藏(所有常量值,必须和RPC规定一致) | ||
14 | + */ | ||
15 | + const COLLECTION_NO = 0; | ||
16 | + | ||
17 | + /** | ||
18 | + * 是否收藏:已收藏 | ||
19 | + */ | ||
20 | + const COLLECTION_YES = 1; | ||
21 | + | ||
22 | + /* | ||
23 | + * 封面类型:无 | ||
24 | + */ | ||
25 | + const COVER_TYPE_NONE = 0; | ||
26 | + | ||
27 | + /* | ||
28 | + * 封面类型:图片 | ||
29 | + */ | ||
30 | + const COVER_TYPE_IMAGE = 1; | ||
31 | + | ||
32 | + /* | ||
33 | + * 封面类型:音频 | ||
34 | + */ | ||
35 | + const COVER_TYPE_RADIO = 2; | ||
36 | + | ||
37 | + /* | ||
38 | + * 封面类型:视频 | ||
39 | + */ | ||
40 | + const COVER_TYPE_VIDEO = 3; | ||
41 | + | ||
42 | + /* | ||
43 | + * 是否为文件夹:否 | ||
44 | + */ | ||
45 | + const IS_DIR_FALSE = 0; | ||
46 | + | ||
47 | + /* | ||
48 | + * 是否为文件夹:1 | ||
49 | + */ | ||
50 | + const IS_DIR_TRUE = 1; | ||
51 | + | ||
52 | + /* | ||
53 | + * RPC查询收藏状态的url | ||
54 | + */ | ||
55 | + const COLLECTION_STATUS ='/Public/Rpc/Collection/CollectionStatus'; | ||
56 | + | ||
57 | + /* | ||
58 | + * 删除应用数据,同步标记收藏状态的url | ||
59 | + */ | ||
60 | + const COLLECTION_UPDATE = '/Public/Rpc/Collection/CollectionUpdate'; | ||
61 | + | ||
62 | + /* | ||
63 | + * RPC新增收藏的url | ||
64 | + */ | ||
65 | + const COLLECTION_NEW = '/Public/Rpc/Collection/CollectionNew'; | ||
66 | + | ||
67 | + /* | ||
68 | + * RPC取消收藏的url | ||
69 | + */ | ||
70 | + const COLLECTION_DELETE = '/Public/Rpc/Collection/CollectionDelete'; | ||
71 | + | ||
72 | + /** | ||
73 | + * 实例化 | ||
74 | + * @author zhonglei | ||
75 | + * @return RpcFavoriteHelper | ||
76 | + */ | ||
77 | + public static function &instance() | ||
78 | + { | ||
79 | + static $instance; | ||
80 | + | ||
81 | + if (is_null($instance)) { | ||
82 | + $instance = new self(); | ||
83 | + } | ||
84 | + | ||
85 | + return $instance; | ||
86 | + } | ||
87 | + | ||
88 | + /** | ||
89 | + * 查询收藏状态 | ||
90 | + * @author liyifei | ||
91 | + * @param array $data 被收藏数据 | ||
92 | + * + string app 被收藏数据所在应用模块目录标识名 | ||
93 | + * + string uid 当前用户的uid | ||
94 | + * + int dataId 被收藏数据的原始数据 Id | ||
95 | + * @return array | ||
96 | + * array( | ||
97 | + * 'collection' => 1, // 收藏状态(0:未收藏,1:已收藏) | ||
98 | + * ) | ||
99 | + */ | ||
100 | + public function getStatus($data) | ||
101 | + { | ||
102 | + if (empty($data) || !is_array($data)) { | ||
103 | + return []; | ||
104 | + } | ||
105 | + | ||
106 | + // 必传参数 | ||
107 | + $data['app'] = APP_DIR; | ||
108 | + if (!isset($data['uid'], $data['dataId'])) { | ||
109 | + return []; | ||
110 | + } | ||
111 | + | ||
112 | + $url = rpcUrl(self::COLLECTION_STATUS); | ||
113 | + $resJson = \Com\Rpc::phprpc($url)->invoke('index', $data); | ||
114 | + if (!$resJson) { | ||
115 | + return []; | ||
116 | + } | ||
117 | + | ||
118 | + return json_decode($resJson, true); | ||
119 | + } | ||
120 | + | ||
121 | + /** | ||
122 | + * 新增收藏 | ||
123 | + * @author liyifei | ||
124 | + * @param array $data 被收藏数据信息 | ||
125 | + * + string app 被收藏数据所在应用模块目录标识名 | ||
126 | + * + string uid 当前用户的uid | ||
127 | + * + int dataId 被收藏数据的原始数据 Id | ||
128 | + * + string title 收藏标题(同事圈内容,资料库文件(夹)名等) | ||
129 | + * + int cover_type 封面类型(0:无封面,1:图片,2:音频,3:视频) | ||
130 | + * + string cover_id 封面附件ID | ||
131 | + * + string cover_url 封面附件URL | ||
132 | + * + int url 详情跳转地址(请传php相对地址,方便后续维护[/Course/Frontend/Index/Detail?article_id=1&data_id=2]) | ||
133 | + * + string file_type 文件类型(JPG,TXT,PDF等)(资料库必传) | ||
134 | + * + int file_size 文件大小(单位:字节)(资料库必传) | ||
135 | + * + int is_dir 是否为文件夹(0:否,1:是)(资料库必传) | ||
136 | + * @return bool | ||
137 | + */ | ||
138 | + public function addFavorite($data) | ||
139 | + { | ||
140 | + if (empty($data) || !is_array($data)) { | ||
141 | + return false; | ||
142 | + } | ||
143 | + | ||
144 | + // 必传参数 | ||
145 | + $data['app'] = APP_DIR; | ||
146 | + if (!isset($data['uid'], $data['dataId'], $data['title'], $data['url'])) { | ||
147 | + return false; | ||
148 | + } | ||
149 | + | ||
150 | + // 资料库必传参数 | ||
151 | + if (APP_DIR == 'Doc') { | ||
152 | + if (!isset($data['file_type'], $data['file_size'], $data['is_dir'])) { | ||
153 | + return false; | ||
154 | + } | ||
155 | + } | ||
156 | + | ||
157 | + $url = rpcUrl(self::COLLECTION_NEW); | ||
158 | + | ||
159 | + return \Com\Rpc::phprpc($url)->invoke('index', $data); | ||
160 | + } | ||
161 | + | ||
162 | + /** | ||
163 | + * 取消收藏 | ||
164 | + * @author liyifei | ||
165 | + * @param array $data 收藏信息 | ||
166 | + * + string app 被收藏数据所在应用模块目录标识名 | ||
167 | + * + string uid 当前用户的uid | ||
168 | + * + int dataId 被收藏数据的原始数据 Id | ||
169 | + * @return bool | ||
170 | + */ | ||
171 | + public function cancelFavorite($data) | ||
172 | + { | ||
173 | + // 必传参数 | ||
174 | + $data['app'] = APP_DIR; | ||
175 | + if (!isset($data['uid'], $data['dataId'])) { | ||
176 | + return false; | ||
177 | + } | ||
178 | + | ||
179 | + $url = rpcUrl(self::COLLECTION_DELETE); | ||
180 | + | ||
181 | + return \Com\Rpc::phprpc($url)->invoke('index', $data); | ||
182 | + } | ||
183 | + | ||
184 | + /** | ||
185 | + * 删除应用数据时,RPC同步收藏状态 | ||
186 | + * @author liyifei | ||
187 | + * @param array $dataIds 被收藏数据的原始数据 Id。如果是多个使用逗号分割(如:'1,25,65') | ||
188 | + * @return bool | ||
189 | + */ | ||
190 | + public function updateStatus($dataIds) | ||
191 | + { | ||
192 | + if (empty($dataIds) || !is_array($dataIds)) { | ||
193 | + return false; | ||
194 | + } | ||
195 | + | ||
196 | + $url = rpcUrl(self::COLLECTION_UPDATE); | ||
197 | + | ||
198 | + $param = [ | ||
199 | + 'app' => APP_DIR, | ||
200 | + 'dataId' => implode(',', $dataIds), | ||
201 | + ]; | ||
202 | + | ||
203 | + return \Com\Rpc::phprpc($url)->invoke('index', $param); | ||
204 | + } | ||
205 | +} |
trunk/Message/Common/Conf.bak/config.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * config.php | ||
4 | + * 公共配置 | ||
5 | + * $Author$ | ||
6 | + */ | ||
7 | + | ||
8 | +return array( | ||
9 | + | ||
10 | + // '配置项'=>'配置值' | ||
11 | + | ||
12 | + // 默认模块 | ||
13 | + 'DEFAULT_MODULE' => 'Home', | ||
14 | + | ||
15 | + // 默认控制器 | ||
16 | + 'DEFAULT_CONTROLLER' => 'Frontend/Index', | ||
17 | + | ||
18 | + // 附件服务器 | ||
19 | + 'FILE_SERVER_URL' => 'http://file/', | ||
20 | + | ||
21 | + // 头像服务器 | ||
22 | + 'FACE_SERVER_URL' => 'http://face/', | ||
23 | + | ||
24 | + // 开启多语言 | ||
25 | + 'LANG_SWITCH_ON' => true, | ||
26 | + | ||
27 | + // 自动侦测语言 开启多语言功能后有效 | ||
28 | + 'LANG_AUTO_DETECT' => true, | ||
29 | + | ||
30 | + // 允许切换的语言列表 用逗号分隔 | ||
31 | + 'LANG_LIST' => 'zh-cn', | ||
32 | + | ||
33 | + // 默认语言切换变量 | ||
34 | + 'VAR_LANGUAGE' => 'lang', | ||
35 | + | ||
36 | + // 数据库表前缀 | ||
37 | + 'DB_PREFIX' => 'oa_news_', | ||
38 | + | ||
39 | + // 数据库连接参数 | ||
40 | + 'DB_PARAMS' => array(), | ||
41 | + | ||
42 | + // 数据库调试模式 开启后可以记录SQL日志 | ||
43 | + 'DB_DEBUG' => true, | ||
44 | + | ||
45 | + // 启用字段缓存 | ||
46 | + 'DB_FIELDS_CACHE' => true, | ||
47 | + | ||
48 | + // 数据库编码默认采用utf8 | ||
49 | + 'DB_CHARSET' => 'utf8', | ||
50 | + | ||
51 | + // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器) | ||
52 | + 'DB_DEPLOY_TYPE' => 0, | ||
53 | + | ||
54 | + // 数据库读写是否分离 主从式有效 | ||
55 | + 'DB_RW_SEPARATE' => false, | ||
56 | + | ||
57 | + // 读写分离后 主服务器数量 | ||
58 | + 'DB_MASTER_NUM' => 1, | ||
59 | + | ||
60 | + // 指定从服务器序号 | ||
61 | + 'DB_SLAVE_NO' => '', | ||
62 | + | ||
63 | + // 前端路径 | ||
64 | + 'FRONTEND_PATH' => 'h5', | ||
65 | + | ||
66 | + // SDK 配置 第三方标识 | ||
67 | + 'SDK_THIRD_IDENTIFIER' => 'qy', | ||
68 | +); |
trunk/Message/Common/Conf.bak/debug.php
0 → 100644
trunk/Message/Common/Conf.bak/tags.php
0 → 100644
trunk/Message/Common/Conf/config.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * config.php | ||
4 | + * 公共配置 | ||
5 | + * $Author$ | ||
6 | + */ | ||
7 | + | ||
8 | +return array( | ||
9 | + | ||
10 | + // '配置项'=>'配置值' | ||
11 | + | ||
12 | + // 默认模块 | ||
13 | + 'DEFAULT_MODULE' => 'Home', | ||
14 | + | ||
15 | + // 默认控制器 | ||
16 | + 'DEFAULT_CONTROLLER' => 'Frontend/Index', | ||
17 | + | ||
18 | + // 附件服务器 | ||
19 | + 'FILE_SERVER_URL' => 'http://file/', | ||
20 | + | ||
21 | + // 头像服务器 | ||
22 | + 'FACE_SERVER_URL' => 'http://face/', | ||
23 | + | ||
24 | + // 开启多语言 | ||
25 | + 'LANG_SWITCH_ON' => true, | ||
26 | + | ||
27 | + // 自动侦测语言 开启多语言功能后有效 | ||
28 | + 'LANG_AUTO_DETECT' => true, | ||
29 | + | ||
30 | + // 允许切换的语言列表 用逗号分隔 | ||
31 | + 'LANG_LIST' => 'zh-cn', | ||
32 | + | ||
33 | + // 默认语言切换变量 | ||
34 | + 'VAR_LANGUAGE' => 'lang', | ||
35 | + | ||
36 | + // 数据库表前缀 | ||
37 | + 'DB_PREFIX' => 'luoyanshou_', | ||
38 | + | ||
39 | + // 数据库连接参数 | ||
40 | + 'DB_PARAMS' => array(), | ||
41 | + | ||
42 | + // 数据库调试模式 开启后可以记录SQL日志 | ||
43 | + 'DB_DEBUG' => true, | ||
44 | + | ||
45 | + // 启用字段缓存 | ||
46 | + 'DB_FIELDS_CACHE' => true, | ||
47 | + | ||
48 | + // 数据库编码默认采用utf8 | ||
49 | + 'DB_CHARSET' => 'utf8', | ||
50 | + | ||
51 | + // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器) | ||
52 | + 'DB_DEPLOY_TYPE' => 0, | ||
53 | + | ||
54 | + // 数据库读写是否分离 主从式有效 | ||
55 | + 'DB_RW_SEPARATE' => false, | ||
56 | + | ||
57 | + // 读写分离后 主服务器数量 | ||
58 | + 'DB_MASTER_NUM' => 1, | ||
59 | + | ||
60 | + // 指定从服务器序号 | ||
61 | + 'DB_SLAVE_NO' => '', | ||
62 | + | ||
63 | + // 前端路径 | ||
64 | + 'FRONTEND_PATH' => 'h5', | ||
65 | + | ||
66 | + // SDK 配置 第三方标识 | ||
67 | + 'SDK_THIRD_IDENTIFIER' => 'qy', | ||
68 | +); |
trunk/Message/Common/Conf/debug.php
0 → 100644
trunk/Message/Common/Conf/tags.php
0 → 100644
trunk/Message/Common/Lang/zh-cn.php
0 → 100644
trunk/Message/Common/Model/AbstractModel.class.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * AbstractModel.class.php | ||
4 | + * Model 层基类 | ||
5 | + * @author: zhuxun37 | ||
6 | + * @version: $Id$ | ||
7 | + * @copyright: vchangyi.com | ||
8 | + */ | ||
9 | +namespace Common\Model; | ||
10 | + | ||
11 | +abstract class AbstractModel extends \Com\Model | ||
12 | +{ | ||
13 | + /** | ||
14 | + * 维护表名,主要用处是连表查询的时候避免表名的硬编码。 | ||
15 | + */ | ||
16 | + protected $_tb_article = ''; | ||
17 | + | ||
18 | + protected $_tb_attach = ''; | ||
19 | + | ||
20 | + protected $_tb_class = ''; | ||
21 | + | ||
22 | + protected $_tb_like = ''; | ||
23 | + | ||
24 | + protected $_tb_read = ''; | ||
25 | + | ||
26 | + protected $_tb_right = ''; | ||
27 | + | ||
28 | + protected $_tb_favorite = ''; | ||
29 | + | ||
30 | + | ||
31 | + // 构造方法 | ||
32 | + public function __construct() | ||
33 | + { | ||
34 | + parent::__construct(); | ||
35 | + $this->_tb_arctic = cfg('DB_PREFIX') . 'article'; | ||
36 | + $this->_tb_attach = cfg('DB_PREFIX') . 'attach'; | ||
37 | + $this->_tb_class = cfg('DB_PREFIX') . 'class'; | ||
38 | + $this->_tb_like = cfg('DB_PREFIX') . 'like'; | ||
39 | + $this->_tb_read = cfg('DB_PREFIX') . 'read'; | ||
40 | + $this->_tb_right = cfg('DB_PREFIX') . 'right'; | ||
41 | + $this->_tb_favorite = cfg('DB_PREFIX') . 'favorite'; | ||
42 | + } | ||
43 | +} |
trunk/Message/Common/Model/RightModel.class.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: tangxingguo | ||
5 | + * Date: 2017/4/12 | ||
6 | + * Time: 10:33 | ||
7 | + */ | ||
8 | +namespace Common\Model; | ||
9 | + | ||
10 | +use Common\Common\Constant; | ||
11 | + | ||
12 | +class RightModel extends AbstractModel | ||
13 | +{ | ||
14 | + | ||
15 | + // 构造方法 | ||
16 | + public function __construct() | ||
17 | + { | ||
18 | + parent::__construct(); | ||
19 | + } | ||
20 | + | ||
21 | + /** | ||
22 | + * 根据权限数据构建查询条件 | ||
23 | + * @author zhonglei | ||
24 | + * @param array $rights 权限数据 | ||
25 | + * @return array | ||
26 | + */ | ||
27 | + public function buildConds($rights) | ||
28 | + { | ||
29 | + $conds = []; | ||
30 | + | ||
31 | + if (!is_array($rights) || empty($rights)) { | ||
32 | + return $conds; | ||
33 | + } | ||
34 | + | ||
35 | + foreach ($rights as $k => $v) { | ||
36 | + switch ($k) { | ||
37 | + // 全公司 | ||
38 | + case Constant::RIGHT_TYPE_ALL: | ||
39 | + $conds[] = "`obj_type` = {$k}"; | ||
40 | + break; | ||
41 | + | ||
42 | + // 部门、标签、人员、职位、角色 | ||
43 | + default: | ||
44 | + $obj_id = implode("','", $v); | ||
45 | + $conds[] = "(`obj_type` = {$k} and `obj_id` in ('{$obj_id}'))"; | ||
46 | + } | ||
47 | + } | ||
48 | + | ||
49 | + return $conds; | ||
50 | + } | ||
51 | + | ||
52 | + /** | ||
53 | + * 根据新闻ID和权限数据计算数量 | ||
54 | + * @author zhonglei | ||
55 | + * @param int $article_id 新闻ID | ||
56 | + * @param array $rights 权限数据 | ||
57 | + * @return int | ||
58 | + */ | ||
59 | + public function countByRight($article_id, $rights) | ||
60 | + { | ||
61 | + $count = 0; | ||
62 | + | ||
63 | + if (!is_array($rights) || empty($rights)) { | ||
64 | + return $count; | ||
65 | + } | ||
66 | + | ||
67 | + $conds = $this->buildConds($rights); | ||
68 | + $where = '`article_id` = ? and (' . implode(' OR ', $conds) . ') and `domain` = ? and status < ?'; | ||
69 | + $sql = "SELECT COUNT(*) FROM __TABLE__ WHERE {$where}"; | ||
70 | + | ||
71 | + $params = [ | ||
72 | + $article_id, | ||
73 | + QY_DOMAIN, | ||
74 | + $this->get_st_delete(), | ||
75 | + ]; | ||
76 | + | ||
77 | + $count = $this->_m->result($sql, $params); | ||
78 | + return intval($count); | ||
79 | + } | ||
80 | + | ||
81 | + /** | ||
82 | + * 根据需要的数据类型和权限数据获取数据 | ||
83 | + * @author liyifei | ||
84 | + * @param array $rights 权限数据 | ||
85 | + * @return array | ||
86 | + */ | ||
87 | + public function listByRight($rights) | ||
88 | + { | ||
89 | + if (!is_array($rights) || empty($rights)) { | ||
90 | + return []; | ||
91 | + } | ||
92 | + | ||
93 | + $conds = $this->buildConds($rights); | ||
94 | + | ||
95 | + $where = '`article_id` > ? and (' . implode(' OR ', $conds) . ') and `domain` = ? and status < ?'; | ||
96 | + $sql = "SELECT `article_id` FROM __TABLE__ WHERE {$where}"; | ||
97 | + | ||
98 | + $params = [ | ||
99 | + 0, | ||
100 | + QY_DOMAIN, | ||
101 | + $this->get_st_delete(), | ||
102 | + ]; | ||
103 | + | ||
104 | + return $this->_m->fetch_array($sql, $params); | ||
105 | + } | ||
106 | +} |
trunk/Message/Common/Model/SettingModel.class.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: tangxingguo | ||
5 | + * Date: 2017/2/8 | ||
6 | + * Time: 15:40 | ||
7 | + */ | ||
8 | + | ||
9 | +namespace Common\Model; | ||
10 | + | ||
11 | +class SettingModel extends AbstractModel | ||
12 | +{ | ||
13 | + | ||
14 | + // 构造方法 | ||
15 | + public function __construct() | ||
16 | + { | ||
17 | + parent::__construct(); | ||
18 | + } | ||
19 | +} |
trunk/Message/Common/Model/SyscacheModel.class.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: tangxingguo | ||
5 | + * Date: 2017/2/8 | ||
6 | + * Time: 15:41 | ||
7 | + */ | ||
8 | + | ||
9 | +namespace Common\Model; | ||
10 | + | ||
11 | +class SyscacheModel extends AbstractModel | ||
12 | +{ | ||
13 | + | ||
14 | + // 构造方法 | ||
15 | + public function __construct() | ||
16 | + { | ||
17 | + parent::__construct(); | ||
18 | + } | ||
19 | +} |
trunk/Message/Common/Model/index.html
0 → 100644
No preview for this file type
trunk/Message/Common/Service/AbstractService.class.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * AbstractService.class.php | ||
4 | + * Service 层基类 | ||
5 | + * @author: tangxingguo | ||
6 | + * @version: $Id$ | ||
7 | + * @copyright: vchangyi.com | ||
8 | + */ | ||
9 | +namespace Common\Service; | ||
10 | + | ||
11 | +use VcySDK\Service; | ||
12 | +use Common\Model\RightModel; | ||
13 | + | ||
14 | +abstract class AbstractService extends \Com\Service | ||
15 | +{ | ||
16 | + | ||
17 | + // 构造方法 | ||
18 | + public function __construct() | ||
19 | + { | ||
20 | + $this->_right = new RightModel(); | ||
21 | + | ||
22 | + parent::__construct(); | ||
23 | + } | ||
24 | +} |
trunk/Message/Common/Service/SettingService.class.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: tangxingguo | ||
5 | + * Date: 2017/2/8 | ||
6 | + * Time: 15:43 | ||
7 | + */ | ||
8 | +namespace Common\Service; | ||
9 | + | ||
10 | +use Common\Model\SettingModel; | ||
11 | + | ||
12 | +class SettingService extends AbstractService | ||
13 | +{ | ||
14 | + // 构造方法 | ||
15 | + public function __construct() | ||
16 | + { | ||
17 | + parent::__construct(); | ||
18 | + $this->_d = new SettingModel(); | ||
19 | + } | ||
20 | +} |
trunk/Message/Common/Service/SyscacheService.class.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: tangxingguo | ||
5 | + * Date: 2017/2/8 | ||
6 | + * Time: 15:44 | ||
7 | + */ | ||
8 | + | ||
9 | +namespace Common\Service; | ||
10 | + | ||
11 | +use Common\Model\SyscacheModel; | ||
12 | + | ||
13 | +class SyscacheService extends AbstractService | ||
14 | +{ | ||
15 | + | ||
16 | + // 构造方法 | ||
17 | + public function __construct() | ||
18 | + { | ||
19 | + parent::__construct(); | ||
20 | + $this->_d = new SyscacheModel(); | ||
21 | + } | ||
22 | +} |
trunk/Message/Common/Service/index.html
0 → 100644
No preview for this file type
trunk/Message/Common/Sql/data.php
0 → 100644
trunk/Message/Common/Sql/structure.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * 应用的数据表结构文件 | ||
4 | + * structure.php | ||
5 | + * $Author$ | ||
6 | + */ | ||
7 | +return " | ||
8 | +CREATE TABLE IF NOT EXISTS luoyanshou( | ||
9 | +u_id INT UNSIGNED NOT NULL auto_increment COMMENT '用户ID', | ||
10 | +u_name VARCHAR(15) NOT NULL DEFAULT '姓名'COMMENT '用户名', | ||
11 | +u_sex TINYINT UNSIGNED DEFAULT 0 COMMENT '用户性别', | ||
12 | +u_mail VARCHAR(50) NULL COMMENT '邮箱', | ||
13 | +u_tel VARCHAR(11) NULL COMMENT '电话', | ||
14 | +`status` TINYINT DEFAULT 0 COMMENT '用户状态 0:有效 1:无效', | ||
15 | +ins_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP() COMMENT '插入时间', | ||
16 | +upd_date TIMESTAMP NULL COMMENT '修改时间', | ||
17 | +PRIMARY KEY(`u_id`) | ||
18 | +)ENGINE=INNODB DEFAULT charset=utf8; | ||
19 | + | ||
20 | +CREATE TABLE IF NOT EXISTS luoyanshou_messages( | ||
21 | +m_id INT UNSIGNED NOT NULL auto_increment COMMENT '留言ID', | ||
22 | +m_title varchar(80) DEFAULT '' COMMENT '标题', | ||
23 | +m_content VARCHAR(500) DEFAULT '' COMMENT '留言', | ||
24 | +m_imgs VARCHAR(1000) DEFAULT '' COMMENT '图片路径', | ||
25 | +m_ip varchar(20) DEFAULT '' COMMENT '留言IP', | ||
26 | +m_status TINYINT UNSIGNED DEFAULT 1 COMMENT '1:未审核 2:已审核 3:已删除', | ||
27 | +m_uid INT UNSIGNED NOT NULL COMMENT '用户ID', | ||
28 | +ins_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP() COMMENT '留言时间', | ||
29 | +upd_date TIMESTAMP NULL COMMENT '修改/删除时间', | ||
30 | +PRIMARY KEY (`m_id`), | ||
31 | +FOREIGN KEY(`m_uid`) REFERENCES luoyanshou(`u_id`) ON DELETE CASCADE ON UPDATE CASCADE | ||
32 | +)ENGINE=INNODB DEFAULT charset=utf8; | ||
33 | + | ||
34 | +CREATE TABLE IF NOT EXISTS luoyanshou_attachment( | ||
35 | +a_mid INT UNSIGNED NOT NULL COMMENT '留言ID', | ||
36 | +a_path VARCHAR(200) DEFAULT '' COMMENT '附件路径', | ||
37 | +a_status TINYINT UNSIGNED COMMENT '0:未删除 1:已删除', | ||
38 | +ins_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP() COMMENT '上传时间', | ||
39 | +upd_date TIMESTAMP NULL COMMENT '修改/删除时间', | ||
40 | +PRIMARY KEY(`a_mid`,`a_path`), | ||
41 | +FOREIGN KEY(`a_mid`) REFERENCES luoyanshou_messages(`m_id`) ON DELETE CASCADE ON UPDATE CASCADE | ||
42 | +)ENGINE=INNODB DEFAULT charset=utf8 | ||
43 | + | ||
44 | +CREATE TABLE IF NOT EXISTS luoyanshou_comment( | ||
45 | +c_uid INT UNSIGNED NOT NULL COMMENT '评论用户ID', | ||
46 | +c_mid INT UNSIGNED NOT NULL COMMENT '被评论留言ID', | ||
47 | +c_comment VARCHAR(140) DEFAULT '' COMMENT '评论内容', | ||
48 | +ins_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP() COMMENT '评论时间', | ||
49 | +upd_date TIMESTAMP NULL COMMENT '修改时间', | ||
50 | +FOREIGN KEY(`c_uid`) REFERENCES luoyanshou(`u_id`) ON DELETE CASCADE ON UPDATE CASCADE, | ||
51 | +FOREIGN KEY(`c_mid`) REFERENCES luoyanshou_messages(`m_id`) ON DELETE CASCADE ON UPDATE CASCADE | ||
52 | +)ENGINE=INNODB DEFAULT charset=utf8 | ||
53 | + | ||
54 | + | ||
55 | + | ||
56 | + | ||
57 | +"; |
trunk/Message/Common/View/Frontend/Default.tpl
0 → 100644
1 | +<include file="Common@Frontend/Header" /> | ||
2 | + | ||
3 | +<h1 class="failure">{$title}</h1> | ||
4 | + | ||
5 | +<p> | ||
6 | +<strong>Module</strong>: {:MODULE_NAME}<br /> | ||
7 | +<strong>Controller</strong>: {:CONTROLLER_NAME} | ||
8 | +</p> | ||
9 | + | ||
10 | +<include file="Common@Frontend/Footer" /> | ||
0 | \ No newline at end of file | 11 | \ No newline at end of file |
trunk/Message/Common/View/Frontend/Error.tpl
0 → 100644
1 | +<include file="Common@Frontend/Header" /> | ||
2 | + | ||
3 | +<head> | ||
4 | + <style type="text/css"> | ||
5 | + body { | ||
6 | + background-color: #f0eff5; | ||
7 | + } | ||
8 | + | ||
9 | + .error-page { | ||
10 | + margin-top: 2.35rem; | ||
11 | + text-align: center; | ||
12 | + } | ||
13 | + | ||
14 | + .error-page img { | ||
15 | + width: 3.11rem; | ||
16 | + height: 2.53rem; | ||
17 | + } | ||
18 | + | ||
19 | + .error-page span { | ||
20 | + display: block; | ||
21 | + font-size: 0.24rem; | ||
22 | + color: #555555; | ||
23 | + } | ||
24 | + .display-no { | ||
25 | + display: none; | ||
26 | + } | ||
27 | + </style> | ||
28 | + <script> | ||
29 | + var doc = document.documentElement; | ||
30 | + var deviceWidth = doc.clientWidth > 640 ? 640 : doc.clientWidth; | ||
31 | + doc.style.fontSize = deviceWidth / 6.4 + 'px'; | ||
32 | + </script> | ||
33 | +</head> | ||
34 | +<body> | ||
35 | +<div class="error-page"> | ||
36 | + <img src="/static/img/frontendError.png"> | ||
37 | + <span>网络正忙,请稍后再试</span> | ||
38 | + <div class="display-no"> | ||
39 | + errorCode:{$error_code}; | ||
40 | + errorMsg:{$error_msg} | ||
41 | + </div> | ||
42 | +</div> | ||
43 | +</body> | ||
44 | + | ||
45 | + | ||
46 | +<include file="Common@Frontend/Footer" /> | ||
0 | \ No newline at end of file | 47 | \ No newline at end of file |
trunk/Message/Common/View/Frontend/Footer.tpl
0 → 100644
trunk/Message/Common/View/Frontend/Header.tpl
0 → 100644
1 | +<!DOCTYPE html> | ||
2 | +<html lang="zh-CN"> | ||
3 | +<head> | ||
4 | +<meta charset="UTF-8" /> | ||
5 | +<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" /> | ||
6 | +<meta name="format-detection" content="telephone=no" /> | ||
7 | +<title>{$title}</title> | ||
8 | +</head> | ||
9 | +<body> |
trunk/Message/Common/View/Frontend/Redirect.tpl
0 → 100644
1 | +<include file="Common@Frontend/Header" /> | ||
2 | + | ||
3 | +<script type="text/javascript"> | ||
4 | + <php>if (!empty($redirectUrl)) {</php> | ||
5 | + <php>if (stripos($os, 'android') !== false || '' != $top) {</php> | ||
6 | + window.top.location.href = '{$redirectUrl}'; | ||
7 | + <php>} else {</php> | ||
8 | + window.location.href = '{$redirectUrl}'; | ||
9 | + <php>}</php> | ||
10 | + <php>}</php> | ||
11 | + <php>if (!empty($javascript)) {</php> | ||
12 | + {$javascript} | ||
13 | + <php>}</php> | ||
14 | +</script> | ||
15 | + | ||
16 | +<include file="Common@Frontend/Footer" /> | ||
0 | \ No newline at end of file | 17 | \ No newline at end of file |
trunk/Message/Frontend/Controller/Callback/AbstractController.class.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * 应用回调控制层 | ||
5 | + * User: zhoutao | ||
6 | + * Date: 16/7/14 | ||
7 | + * Time: 下午2:56 | ||
8 | + */ | ||
9 | + | ||
10 | +namespace Frontend\Controller\Callback; | ||
11 | + | ||
12 | +use VcySDK\Service; | ||
13 | + | ||
14 | +abstract class AbstractController extends \Common\Controller\Frontend\AbstractController | ||
15 | +{ | ||
16 | + | ||
17 | + // 回调数据 | ||
18 | + protected $callBackData = []; | ||
19 | + | ||
20 | + public function before_action($action = '') | ||
21 | + { | ||
22 | + | ||
23 | + // 不必登陆 | ||
24 | + $this->_require_login = false; | ||
25 | + // 接收消息 | ||
26 | + $service = &Service::instance(); | ||
27 | + $this->callBackData = $service->streamJsonData(); | ||
28 | + | ||
29 | + return parent::before_action($action); | ||
30 | + } | ||
31 | + | ||
32 | + public function after_action($action = '') | ||
33 | + { | ||
34 | + parent::after_action($action); | ||
35 | + exit('SUCCESS'); | ||
36 | + } | ||
37 | + | ||
38 | + /** | ||
39 | + * 获取 identifier | ||
40 | + * @return bool | ||
41 | + */ | ||
42 | + protected function _identifier() | ||
43 | + { | ||
44 | + return true; | ||
45 | + } | ||
46 | +} |
trunk/Message/Frontend/Controller/Callback/CheckAttachController.class.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: liyifei2012it | ||
5 | + * Date: 17/4/13 | ||
6 | + * Time: 11:38 | ||
7 | + */ | ||
8 | +namespace Frontend\Controller\Callback; | ||
9 | + | ||
10 | +use Think\Log; | ||
11 | +use VcySDK\Service; | ||
12 | +use VcySDK\Cron; | ||
13 | +use VcySDK\FileConvert; | ||
14 | +use Common\Common\Constant; | ||
15 | +use Common\Common\NewsHelper; | ||
16 | +use Common\Service\ArticleService; | ||
17 | +use Common\Service\AttachService; | ||
18 | +use Common\Service\TaskService; | ||
19 | +use Common\Service\ClassService; | ||
20 | + | ||
21 | +class CheckAttachController extends AbstractController | ||
22 | +{ | ||
23 | + /** | ||
24 | + * 附件转换计划任务 | ||
25 | + * @author zhonglei | ||
26 | + */ | ||
27 | + public function Index() | ||
28 | + { | ||
29 | + Log::record(sprintf('---%s %s CheckAttach START---', QY_DOMAIN, APP_IDENTIFIER), Log::INFO); | ||
30 | + | ||
31 | + $article_id = I('get.article_id', 0, 'intval'); | ||
32 | + $cron_id = I('get.cron_id', '', 'trim'); | ||
33 | + if (empty($article_id)) { | ||
34 | + $this->_exit(); | ||
35 | + } | ||
36 | + | ||
37 | + $taskServ = new TaskService(); | ||
38 | + $task = $taskServ->get_by_conds(['article_id' => $article_id]); | ||
39 | + // 本地未找到任务,删除UC的任务后退出 | ||
40 | + if (empty($task)) { | ||
41 | + if (!empty($cron_id)) { | ||
42 | + $this->_delTask($article_id, $cron_id); | ||
43 | + } | ||
44 | + Log::record("not found task, article_id: {$article_id}", Log::INFO); | ||
45 | + $this->_exit(); | ||
46 | + } | ||
47 | + | ||
48 | + $cron_id = $task['cron_id']; | ||
49 | + $articleServ = new ArticleService(); | ||
50 | + $article = $articleServ->get($article_id); | ||
51 | + | ||
52 | + // 未找到新闻,删除计划任务 | ||
53 | + if (empty($article)) { | ||
54 | + Log::record("not found article, article_id: {$article_id}", Log::INFO); | ||
55 | + $this->_delTask($article_id, $cron_id); | ||
56 | + } | ||
57 | + | ||
58 | + // 获取附件 | ||
59 | + $attachServ = new AttachService(); | ||
60 | + $list = $attachServ->list_by_conds(['article_id' => $article_id]); | ||
61 | + $attachs = $attachServ->formatDBData($list); | ||
62 | + | ||
63 | + // 未找到附件,删除计划任务 | ||
64 | + if (empty($attachs)) { | ||
65 | + Log::record("not found attach, article_id: {$article_id}", Log::INFO); | ||
66 | + $this->_delTask($article_id, $cron_id); | ||
67 | + } | ||
68 | + | ||
69 | + $convertServ = new FileConvert(Service::instance()); | ||
70 | + | ||
71 | + $at_convert_status = []; | ||
72 | + foreach ($attachs as $k => $data) { | ||
73 | + // 仅处理文件 (视频现在必须转码完成后才能提交,因此不会在保存后进行转码) | ||
74 | + if (!in_array($k, [Constant::ATTACH_TYPE_FILE])) { | ||
75 | + continue; | ||
76 | + } | ||
77 | + | ||
78 | + foreach ($data as $attach) { | ||
79 | + // 已完成 | ||
80 | + if (!empty($attach['at_convert_url'])) { | ||
81 | + continue; | ||
82 | + } | ||
83 | + | ||
84 | + $at_convert_url = ''; | ||
85 | + // 默认转码中 | ||
86 | + $at_convert_status[$attach['at_id']] = Constant::FILE_STATUS_CONVERT; | ||
87 | + | ||
88 | + switch ($k) { | ||
89 | + // 视频 (视频现在必须转码完成后才能提交,因此不会在保存后进行转码;但此段代码暂时保留) | ||
90 | + case Constant::ATTACH_TYPE_VIDEO: | ||
91 | + $result = $convertServ->getVodPlayUrl($attach['at_id']); | ||
92 | + if (is_array($result) && (isset($result['url']) || isset($result['hd']))) { | ||
93 | + $at_convert_url = str_replace('http://', '//', (!empty($result['hd']) ? $result['hd'] : $result['url'])); | ||
94 | + $at_convert_url = str_replace('https://', '//', $at_convert_url); | ||
95 | + | ||
96 | + // 视频封面地址 | ||
97 | + $at_cover_url = str_replace('http://', '//', $result['coverUrl']); | ||
98 | + $at_cover_url = str_replace('https://', '//', $at_cover_url); | ||
99 | + | ||
100 | + // 转码成功 | ||
101 | + $at_convert_status[$attach['at_id']] = Constant::FILE_STATUS_NORMAL; | ||
102 | + } | ||
103 | + break; | ||
104 | + | ||
105 | + // 文件 | ||
106 | + case Constant::ATTACH_TYPE_FILE: | ||
107 | + $result = $convertServ->get($attach['at_id']); | ||
108 | + if (is_array($result) && isset($result['caConvertStatus'])) { | ||
109 | + // 转码成功 | ||
110 | + if ($result['caConvertStatus'] == FileConvert::CONVERT_STATUS_SUCCESS) { | ||
111 | + $at_convert_url = $result['caAttachment']; | ||
112 | + $at_convert_status[$attach['at_id']] = Constant::FILE_STATUS_NORMAL; | ||
113 | + } | ||
114 | + | ||
115 | + // 转码失败(状态不是:待处理、转码中、成功,即为失败) | ||
116 | + $normalStatus = [ | ||
117 | + FileConvert::CONVERT_STATUS_WATTING, | ||
118 | + FileConvert::CONVERT_STATUS_ING, | ||
119 | + FileConvert::CONVERT_STATUS_SUCCESS, | ||
120 | + ]; | ||
121 | + if (!in_array($result['caConvertStatus'], $normalStatus)) { | ||
122 | + $at_convert_status[$attach['at_id']] = Constant::FILE_STATUS_FAIL; | ||
123 | + } | ||
124 | + } | ||
125 | + break; | ||
126 | + } | ||
127 | + | ||
128 | + // 更新文件转码地址 | ||
129 | + if (!empty($at_convert_url)) { | ||
130 | + $attachServ->update( | ||
131 | + $attach['attach_id'], | ||
132 | + [ | ||
133 | + 'at_convert_url' => $at_convert_url, | ||
134 | + 'at_cover_url' => isset($at_cover_url) ? $at_cover_url : '' | ||
135 | + ] | ||
136 | + ); | ||
137 | + Log::record("convert success, attach_id: {$attach['attach_id']}, at_convert_url: {$at_convert_url}", Log::INFO); | ||
138 | + } | ||
139 | + } | ||
140 | + } | ||
141 | + | ||
142 | + // 所有需转码文件的转码状态 | ||
143 | + $convert_status = array_unique(array_values($at_convert_status)); | ||
144 | + | ||
145 | + // 新闻转码失败(将新闻发布状态改为"草稿",文件转码状态改为"转码失败") | ||
146 | + if (in_array(Constant::FILE_STATUS_FAIL, $convert_status)) { | ||
147 | + $articleServ->update($article_id, ['news_status' => Constant::NEWS_STATUS_DRAFT, 'convert_status' => Constant::FILE_STATUS_FAIL]); | ||
148 | + Log::record("update article news_status, article_id: {$article_id}", Log::INFO); | ||
149 | + // 结束任务 | ||
150 | + $this->_delTask($article_id, $cron_id); | ||
151 | + } | ||
152 | + | ||
153 | + // 新闻转码成功 | ||
154 | + if (count($convert_status) == 1 && in_array(Constant::FILE_STATUS_NORMAL, $convert_status)) { | ||
155 | + if ($article['news_status'] == Constant::NEWS_STATUS_READY_SEND) { | ||
156 | + // 修改文件发布状态、转码状态 | ||
157 | + | ||
158 | + // 修改转码状态为已转码,当发布状态不为定时发布时修改为已发布,否则不做修改 | ||
159 | + $updateData = ['convert_status' => Constant::FILE_STATUS_NORMAL]; | ||
160 | + if ($article['news_status'] != Constant::NEWS_STATUS_TIMING_RELEASE) { | ||
161 | + $updateData['news_status'] = Constant::NEWS_STATUS_SEND; | ||
162 | + } | ||
163 | + $articleServ->update($article_id, $updateData); | ||
164 | + Log::record("update article news_status, article_id: {$article_id}", Log::INFO); | ||
165 | + | ||
166 | + // 当为发布时 | ||
167 | + if (isset($updateData['news_status'])) { | ||
168 | + // 获取顶级分类名称 | ||
169 | + $classServ = new ClassService(); | ||
170 | + $class = $classServ->getTopClass($article['class_id']); | ||
171 | + $article['class_name'] = $class['class_name']; | ||
172 | + | ||
173 | + // 发送未读提醒 | ||
174 | + if ($article['is_notice'] == Constant::NEWS_IS_NOTICE_TRUE) { | ||
175 | + $newsHelper = &NewsHelper::instance(); | ||
176 | + list($uids_all, $uids_read, $uids_unread) = $newsHelper->getReadData($article_id); | ||
177 | + $newsHelper->sendUnreadMsg($uids_unread, $article); | ||
178 | + } | ||
179 | + | ||
180 | + // RPC推送到运营中心 | ||
181 | + if ($article['is_recommend'] == Constant::NEWS_IS_RECOMMEND_TRUE) { | ||
182 | + $articleServ->addNewsRpc($article_id, []); | ||
183 | + } | ||
184 | + } | ||
185 | + } | ||
186 | + | ||
187 | + // 结束任务 | ||
188 | + $this->_delTask($article_id, $cron_id); | ||
189 | + } | ||
190 | + | ||
191 | + $this->_exit(); | ||
192 | + } | ||
193 | + | ||
194 | + /** | ||
195 | + * 退出 | ||
196 | + * @author zhonglei | ||
197 | + * @return void | ||
198 | + */ | ||
199 | + private function _exit() | ||
200 | + { | ||
201 | + // 日志结束 | ||
202 | + Log::record(sprintf('---%s %s CheckAttach END---', QY_DOMAIN, APP_IDENTIFIER), Log::INFO); | ||
203 | + exit('SUCCESS'); | ||
204 | + } | ||
205 | + | ||
206 | + /** | ||
207 | + * 删除计划任务并退出 | ||
208 | + * @author zhonglei | ||
209 | + * @param int $article_id 新闻ID | ||
210 | + * @param string $cron_id 计划任务ID | ||
211 | + * @return void | ||
212 | + */ | ||
213 | + private function _delTask($article_id, $cron_id) | ||
214 | + { | ||
215 | + $taskServ = new TaskService(); | ||
216 | + $taskServ->delete_by_conds([ | ||
217 | + 'article_id' => $article_id, | ||
218 | + 'cron_id' => $cron_id, | ||
219 | + ]); | ||
220 | + | ||
221 | + $cronSdk = new Cron(Service::instance()); | ||
222 | + $cronSdk->delete($cron_id); | ||
223 | + | ||
224 | + Log::record("delete task: {$cron_id}", Log::INFO); | ||
225 | + $this->_exit(); | ||
226 | + } | ||
227 | +} |
trunk/Message/Frontend/Controller/Callback/CheckRightController.class.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: liyifei2012it | ||
5 | + * Date: 17/6/26 | ||
6 | + * Time: 16:14 | ||
7 | + */ | ||
8 | +namespace Frontend\Controller\Callback; | ||
9 | + | ||
10 | +use Think\Log; | ||
11 | +use Common\Common\Constant; | ||
12 | +use Common\Common\ResAuth; | ||
13 | +use Common\Service\ArticleService; | ||
14 | +use Common\Service\ClassService; | ||
15 | +use Common\Service\RightService; | ||
16 | + | ||
17 | +class CheckRightController extends AbstractController | ||
18 | +{ | ||
19 | + public function Index() | ||
20 | + { | ||
21 | + Log::record(sprintf('---%s %s CheckRight Start ---', QY_DOMAIN, APP_DIR), Log::INFO); | ||
22 | + | ||
23 | + // 鉴权失败:缺少必传参数(用户信息、权限载体ID) | ||
24 | + $auth = I('post.auth'); | ||
25 | + $id = I('post._id', 0, 'intval'); | ||
26 | + | ||
27 | + if (empty($auth)) { | ||
28 | + Log::record(sprintf('---%s %s CheckRight FAIL : uc param missing---', QY_DOMAIN, APP_DIR), Log::INFO); | ||
29 | + Log::record('post: ' . var_export($_POST, true), Log::INFO); | ||
30 | + exit('FAIL'); | ||
31 | + } | ||
32 | + | ||
33 | + // 用户信息(管理员 or 普通用户) | ||
34 | + $resAuth = &ResAuth::instance(); | ||
35 | + $data = $resAuth->parseSecret($auth); | ||
36 | + if (empty($data)) { | ||
37 | + Log::record(sprintf('---%s %s CheckRight Fail : parseSecret empty---', QY_DOMAIN, APP_DIR), Log::INFO); | ||
38 | + exit('FAIL'); | ||
39 | + } | ||
40 | + | ||
41 | + switch ($data['user_type']) { | ||
42 | + // 管理员 | ||
43 | + case ResAuth::USER_TYPE_ADMIN: | ||
44 | + Log::record(sprintf('---%s %s CheckRight OK : admin logined---', QY_DOMAIN, APP_DIR), Log::INFO); | ||
45 | + exit('OK'); | ||
46 | + | ||
47 | + // 手机端登录用户 | ||
48 | + case ResAuth::USER_TYPE_MOBILE: | ||
49 | + // 鉴权失败:文章不存在 | ||
50 | + $articleServ = new ArticleService(); | ||
51 | + $article = $articleServ->get($id); | ||
52 | + if (empty($article)) { | ||
53 | + Log::record(sprintf('---%s %s CheckRight FAIL : article not found or news status error---', QY_DOMAIN, APP_DIR), Log::INFO); | ||
54 | + exit('FAIL'); | ||
55 | + } | ||
56 | + | ||
57 | + // 鉴权失败:课程分类不存在或未开启 | ||
58 | + $classServ = new ClassService(); | ||
59 | + $class = $classServ->get($article['class_id']); | ||
60 | + if (empty($class) || $class['is_open'] != Constant::CLASS_IS_OPEN_TRUE) { | ||
61 | + Log::record(sprintf('---%s %s CheckRight FAIL : class not found or already closed---', QY_DOMAIN, APP_DIR), Log::INFO); | ||
62 | + exit('FAIL'); | ||
63 | + } | ||
64 | + | ||
65 | + // 鉴权失败:手机端登录人员无查看权限 | ||
66 | + $rightServ = new RightService(); | ||
67 | + $checkRes = $rightServ->checkUserRight($data['user'], $id); | ||
68 | + | ||
69 | + // 超过1S记录日志 | ||
70 | + if (time() * 1000 - MILLI_TIME >= 1000) { | ||
71 | + Log::record('attach timeout', Log::ERR); | ||
72 | + } | ||
73 | + | ||
74 | + if (!$checkRes) { | ||
75 | + Log::record(sprintf('---%s %s CheckRight FAIL : have not right---', QY_DOMAIN, APP_DIR), Log::INFO); | ||
76 | + exit('FAIL'); | ||
77 | + } | ||
78 | + break; | ||
79 | + } | ||
80 | + | ||
81 | + // 鉴权通过 | ||
82 | + Log::record(sprintf('---%s %s CheckRight END---', QY_DOMAIN, APP_DIR), Log::INFO); | ||
83 | + exit('OK'); | ||
84 | + } | ||
85 | +} |
trunk/Message/Frontend/Controller/Callback/InstallController.class.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: liyifei2012it | ||
5 | + * Date: 17/6/13 | ||
6 | + * Time: 18:13 | ||
7 | + */ | ||
8 | + | ||
9 | +namespace Frontend\Controller\Callback; | ||
10 | + | ||
11 | +class InstallController extends AbstractController | ||
12 | +{ | ||
13 | + /** | ||
14 | + * 应用默认数据安装接口 | ||
15 | + * @author liyifei | ||
16 | + */ | ||
17 | + public function Index() | ||
18 | + { | ||
19 | + exit('SUCCESS'); | ||
20 | + } | ||
21 | +} |
trunk/Message/Frontend/Controller/Callback/ReleaseController.class.php
0 → 100644
1 | +<?php | ||
2 | +/** | ||
3 | + * 定时发布回调 | ||
4 | + * Created by PhpStorm. | ||
5 | + * User: 大熊 | ||
6 | + * Date: 2018/5/16 | ||
7 | + * Time: 19:21 | ||
8 | + */ | ||
9 | + | ||
10 | +namespace Frontend\Controller\Callback; | ||
11 | + | ||
12 | + | ||
13 | +use Common\Common\Constant; | ||
14 | +use Common\Common\NewsHelper; | ||
15 | +use Common\Service\ArticleService; | ||
16 | +use Common\Service\ClassService; | ||
17 | +use Think\Log; | ||
18 | + | ||
19 | +class ReleaseController extends AbstractController | ||
20 | +{ | ||
21 | + public function index() | ||
22 | + { | ||
23 | + $param = $this->callBackData; | ||
24 | + if (empty($param)) { | ||
25 | + $param = I('post.'); | ||
26 | + } | ||
27 | + | ||
28 | + if (empty($param)) { | ||
29 | + return true; | ||
30 | + } | ||
31 | + | ||
32 | + // 获取数据信息 | ||
33 | + $service = new ArticleService(); | ||
34 | + $data = $service->get($param['article_id']); | ||
35 | + | ||
36 | + // 不为定时发布时不做处理 | ||
37 | + if ($data['news_status'] != Constant::NEWS_STATUS_TIMING_RELEASE) { | ||
38 | + return true; | ||
39 | + } | ||
40 | + | ||
41 | + // 判断素材状态,若转码成功则为发布状态,否则为预发布状态 | ||
42 | + $updateData = ['news_status' => Constant::NEWS_STATUS_SEND]; | ||
43 | + if ($data['convert_status'] == Constant::FILE_STATUS_CONVERT) { | ||
44 | + $updateData['news_status'] = Constant::NEWS_STATUS_READY_SEND; | ||
45 | + } | ||
46 | + | ||
47 | + $service->update($param['article_id'], $updateData); | ||
48 | + | ||
49 | + // 当为发布时 | ||
50 | + if ($updateData['news_status'] == Constant::NEWS_STATUS_SEND) { | ||
51 | + // 获取顶级分类名称 | ||
52 | + $classServ = new ClassService(); | ||
53 | + $class = $classServ->getTopClass($data['class_id']); | ||
54 | + $data['class_name'] = $class['class_name']; | ||
55 | + | ||
56 | + // 发送未读提醒 | ||
57 | + if ($data['is_notice'] == Constant::NEWS_IS_NOTICE_TRUE) { | ||
58 | + $newsHelper = &NewsHelper::instance(); | ||
59 | + list($uids_all, $uids_read, $uids_unread) = $newsHelper->getReadData($param['article_id']); | ||
60 | + $newsHelper->sendUnreadMsg($uids_unread, $data); | ||
61 | + } | ||
62 | + | ||
63 | + // RPC推送到运营中心 | ||
64 | + if ($data['is_recommend'] == Constant::NEWS_IS_RECOMMEND_TRUE) { | ||
65 | + $service->addNewsRpc($param['article_id'], []); | ||
66 | + } | ||
67 | + } | ||
68 | + | ||
69 | + return true; | ||
70 | + } | ||
71 | +} | ||
0 | \ No newline at end of file | 72 | \ No newline at end of file |