CourseMemberController.php 12 KB

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