CourseMemberController.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Models\CourseMember;
  4. use App\Models\Course;
  5. use App\Models\UserInfo;
  6. use Illuminate\Http\Request;
  7. use App\Http\Resources\CourseMemberResource;
  8. use App\Http\Api\AuthApi;
  9. use Illuminate\Support\Facades\Log;
  10. use App\Http\Api\UserApi;
  11. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  12. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  13. class CourseMemberController extends Controller
  14. {
  15. /**
  16. * Display a listing of the resource.
  17. *
  18. * @return \Illuminate\Http\Response
  19. */
  20. public function index(Request $request)
  21. {
  22. //
  23. $user = AuthApi::current($request);
  24. if(!$user){
  25. return $this->error(__('auth.failed',[403],403));
  26. }
  27. //判断当前用户是否有指定的 course 的权限
  28. $role = CourseMember::where('course_id', $request->get('id',$request->get('course')))
  29. ->where('user_id',$user['user_uid'])
  30. ->value('role');
  31. if(empty($role)){
  32. return $this->error(__('auth.failed',[403],403));
  33. }
  34. $result=false;
  35. $indexCol = ['id','user_id','course_id',
  36. 'channel_id','role','editor_uid',
  37. 'updated_at','created_at'];
  38. switch ($request->get('view')) {
  39. case 'course':
  40. # 获取 course 内所有 成员
  41. $table = CourseMember::where('course_id', $request->get('id'))
  42. ->where('is_current',true);
  43. break;
  44. case 'timeline':
  45. /**
  46. * 编辑时间线
  47. */
  48. $table = CourseMember::where('user_id',$request->get('userId'));
  49. if($request->get('timeline','current')==='current'){
  50. $table = $table->where('course_id', $request->get('course'));
  51. }
  52. break;
  53. default:
  54. return $this->error('无法识别的参数view',400,400);
  55. break;
  56. }
  57. if(!empty($request->get("role")) && $request->get("role") !=='all'){
  58. $table = $table->where('role', $request->get("role"));
  59. }
  60. if(!empty($request->get("status"))){
  61. $table = $table->whereIn('status', explode(',',$request->get("status")) );
  62. }
  63. if(!empty($request->get("search"))){
  64. $usersId = UserInfo::where('nickname','like', '%'.$request->get("search")."%")
  65. ->select('userid')
  66. ->get();
  67. $table = $table->whereIn('user_id', $usersId);
  68. }
  69. $count = $table->count();
  70. $table = $table->orderBy($request->get('order','created_at'),
  71. $request->get('dir','asc'));
  72. $table = $table->skip($request->get('offset',0))
  73. ->take($request->get('limit',1000));
  74. $result = $table->get();
  75. //获取当前用户角色
  76. $role = CourseMember::where('course_id', $request->get('id'))
  77. ->where('user_id', $user['user_uid'])
  78. ->where('is_current',true)
  79. ->value('role');
  80. return $this->ok(["rows"=>CourseMemberResource::collection($result),'role'=>$role,"count"=>$count]);
  81. }
  82. /**
  83. * Store a newly created resource in storage.
  84. *
  85. * @param \Illuminate\Http\Request $request
  86. * @return \Illuminate\Http\Response
  87. */
  88. public function store(Request $request)
  89. {
  90. //
  91. $user = AuthApi::current($request);
  92. if(!$user){
  93. return $this->error(__('auth.failed',[403],403));
  94. }
  95. $validated = $request->validate([
  96. 'user_id' => 'required',
  97. 'course_id' => 'required',
  98. 'role' => 'required',
  99. 'status' => 'required',
  100. ]);
  101. //查找重复的
  102. if($validated['status'] !== 'invited'){
  103. if(CourseMember::where('course_id', $validated['course_id'])
  104. ->where('user_id',$validated['user_id'])
  105. ->exists()){
  106. return $this->error('member exists',[200],200);
  107. }
  108. }
  109. if($validated['status'] === 'invited'){
  110. $userId = $validated['user_id'];
  111. }else{
  112. $userId = $user['user_uid'];
  113. }
  114. CourseMember::where('course_id',$validated['course_id'])
  115. ->where('user_id',$userId)
  116. ->update(['is_current'=>false]);
  117. $newMember = new CourseMember();
  118. $newMember->course_id = $validated['course_id'];
  119. $newMember->role = $validated['role'];
  120. $newMember->editor_uid = $user['user_uid'];
  121. $newMember->status = $validated['status'];
  122. $newMember->user_id = $userId;
  123. /**
  124. * 查找course 信息,根据加入方式设置状态
  125. * open : accepted
  126. * manual: progressing
  127. */
  128. $course = Course::find($validated['course_id']);
  129. if(!$course){
  130. return $this->error('invalid course');
  131. }
  132. switch ($course->join) {
  133. case 'open': //开放学习课程
  134. if($validated['status']!=='joined' &&
  135. $validated['status']!=='invited'
  136. ){
  137. return $this->error('invalid course',[200],200);
  138. }
  139. break;
  140. case 'manual': //人工审核课程
  141. if($validated['status']!=='applied' &&
  142. $validated['status']!=='invited'
  143. ){
  144. return $this->error('invalid course',[200],200);
  145. }
  146. break;
  147. }
  148. $newMember->save();
  149. return $this->ok(new CourseMemberResource($newMember));
  150. }
  151. /**
  152. * Display the specified resource.
  153. *
  154. * @param \Illuminate\Http\Request $request
  155. * @param string $courseId
  156. * @return \Illuminate\Http\Response
  157. */
  158. public function show(Request $request,string $courseId)
  159. {
  160. //
  161. $user = AuthApi::current($request);
  162. if(!$user){
  163. return $this->error(__('auth.failed'));
  164. }
  165. $userId = $user['user_uid'];
  166. if(!empty($request->get('user_uid'))){
  167. $userId = $request->get('user_uid');
  168. }
  169. $member = CourseMember::where('course_id',$courseId)
  170. ->where('user_id',$userId)
  171. ->where('is_current',true)
  172. ->first();
  173. if($member){
  174. return $this->ok(new CourseMemberResource($member));
  175. }else{
  176. return $this->error('no result',200,200);
  177. }
  178. }
  179. /**
  180. * Update the specified resource in storage.
  181. *
  182. * @param \Illuminate\Http\Request $request
  183. * @param \App\Models\CourseMember $courseMember
  184. * @return \Illuminate\Http\Response
  185. */
  186. public function update(Request $request, CourseMember $courseMember)
  187. {
  188. /**
  189. * 保留原有记录
  190. * 增加一条新纪录
  191. * 原有记录变为历史记录
  192. */
  193. $user = AuthApi::current($request);
  194. if(!$user){
  195. return $this->error(__('auth.failed'));
  196. }
  197. $newMember = new CourseMember();
  198. $newMember->user_id = $courseMember->user_id;
  199. $newMember->course_id = $courseMember->course_id;
  200. $newMember->role = $courseMember->role;
  201. $newMember->status = $courseMember->status;
  202. $newMember->channel_id = $courseMember->channel_id;
  203. $newMember->editor_uid = $user['user_uid'];
  204. $courseMember->is_current = false;
  205. $courseMember->save();
  206. if($request->has('channel_id')) {
  207. if($newMember->user_id !== $user['user_uid']){
  208. return $this->error(__('auth.failed'));
  209. }
  210. $newMember->channel_id = $request->get('channel_id');
  211. }
  212. if($request->has('status')) {
  213. $newMember->status = $request->get('status');
  214. }
  215. $newMember->save();
  216. return $this->ok(new CourseMemberResource($newMember));
  217. }
  218. public function set_channel(Request $request)
  219. {
  220. //
  221. $user = AuthApi::current($request);
  222. if(!$user){
  223. return $this->error(__('auth.failed'));
  224. }
  225. if($request->has('channel_id')) {
  226. $courseMember = CourseMember::where('course_id',$request->get('course_id'))
  227. ->where('user_id',$user['user_uid'])
  228. ->where('is_current',true)
  229. ->first();
  230. if($courseMember){
  231. $courseMember->channel_id = $request->get('channel_id');
  232. $courseMember->save();
  233. return $this->ok(new CourseMemberResource($courseMember));
  234. }else{
  235. return $this->error(__('auth.failed'));
  236. }
  237. }else{
  238. return $this->error(__('auth.failed'));
  239. }
  240. }
  241. /**
  242. * Remove the specified resource from storage.
  243. *
  244. * @param \Illuminate\Http\Request $request
  245. * @param \App\Models\CourseMember $courseMember
  246. * @return \Illuminate\Http\Response
  247. */
  248. public function destroy(Request $request,CourseMember $courseMember)
  249. {
  250. //查看删除者有没有删除权限
  251. //查询删除者的权限
  252. $user = AuthApi::current($request);
  253. if(!$user){
  254. return $this->error(__('auth.failed'));
  255. }
  256. $isOwner = Course::where('id',$courseMember->course_id)->where('studio_id',$user["user_uid"])->exists();
  257. if(!$isOwner){
  258. $courseUser = CourseMember::where('course_id',$courseMember->course_id)
  259. ->where('user_id',$user["user_uid"])
  260. ->select('role')->first();
  261. //open 课程 可以删除自己
  262. if(!$courseUser){
  263. //被删除的不是自己
  264. if($courseUser->role ==="student"){
  265. //普通成员没有删除权限
  266. return $this->error(__('auth.failed'));
  267. }
  268. }
  269. }
  270. $delete = $courseMember->delete();
  271. return $this->ok($delete);
  272. }
  273. /**
  274. * 获取当前用户权限
  275. *
  276. * @param \Illuminate\Http\Request $request
  277. * @return \Illuminate\Http\Response
  278. */
  279. public function curr(Request $request)
  280. {
  281. $user = AuthApi::current($request);
  282. if(!$user){
  283. return $this->error(__('auth.failed'));
  284. }
  285. $courseUser = CourseMember::where('course_id',$request->get("course_id"))
  286. ->where('user_id',$user["user_uid"])
  287. ->where('is_current',true)
  288. ->select(['role','channel_id'])->first();
  289. if($courseUser){
  290. return $this->ok($courseUser);
  291. }else{
  292. return $this->error("not member");
  293. }
  294. }
  295. public function export(Request $request){
  296. $courseUser = CourseMember::where('course_id',$request->get("course_id"))
  297. ->where('is_current',true)
  298. ->get();
  299. $spreadsheet = new Spreadsheet();
  300. $activeWorksheet = $spreadsheet->getActiveSheet();
  301. $activeWorksheet->setCellValue('A1', 'nickname');
  302. $activeWorksheet->setCellValue('B1', 'username');
  303. $activeWorksheet->setCellValue('C1', 'role');
  304. $activeWorksheet->setCellValue('D1', 'status');
  305. $activeWorksheet->setCellValue('E1', 'created_at');
  306. $currLine = 2;
  307. foreach ($courseUser as $key => $row) {
  308. $user = UserApi::getByUuid($row->user_id);
  309. $activeWorksheet->setCellValue("A{$currLine}", $user['nickName']);
  310. $activeWorksheet->setCellValue("B{$currLine}", $user['userName']);
  311. $activeWorksheet->setCellValue("C{$currLine}", $row->role);
  312. $activeWorksheet->setCellValue("D{$currLine}", $row->status);
  313. $activeWorksheet->setCellValue("E{$currLine}", $row->created_at);
  314. $currLine++;
  315. }
  316. $writer = new Xlsx($spreadsheet);
  317. header('Content-Type: application/vnd.ms-excel');
  318. header('Content-Disposition: attachment; filename="course_member.xlsx"');
  319. $writer->save("php://output");
  320. }
  321. }