2
0

CourseMemberController.php 12 KB

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