AnswerController.php 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. <?php
  2. namespace App\Http\Controllers\Ask;
  3. use App\Models\Answer;
  4. use App\Models\Attention;
  5. use App\Models\Question;
  6. use App\Models\QuestionInvitation;
  7. use App\Models\UserTag;
  8. use App\Services\CaptchaService;
  9. use App\Services\QuestionService;
  10. use Illuminate\Http\Request;
  11. use App\Http\Controllers\Controller;
  12. use Illuminate\Support\Facades\Gate;
  13. class AnswerController extends Controller
  14. {
  15. /*问题创建校验*/
  16. protected $validateRules = [
  17. 'content' => 'required|min:15|max:65535',
  18. ];
  19. /**
  20. * Store a newly created resource in storage.
  21. *
  22. * @param \Illuminate\Http\Request $request
  23. * @return \Illuminate\Http\Response
  24. */
  25. public function store(Request $request,CaptchaService $captchaService)
  26. {
  27. $loginUser = $request->user();
  28. if($loginUser->status === 0){
  29. return $this->error(route('website.index'),'操作失败!您的邮箱还未验证,验证后才能进行该操作!');
  30. }
  31. /*防灌水检查*/
  32. if( Setting()->get('answer_limit_num') > 0 ){
  33. $questionCount = $this->counter('answer_num_'. $loginUser->id);
  34. if( $questionCount > Setting()->get('answer_limit_num')){
  35. return $this->showErrorMsg(route('website.index'),'你已超过每小时回答限制数'.Setting()->get('answer_limit_num').',请稍后再进行该操作,如有疑问请联系管理员!');
  36. }
  37. }
  38. $question_id = $request->input('question_id');
  39. $question = Question::find($question_id);
  40. if(empty($question)){
  41. abort(404);
  42. }
  43. $request->flash();
  44. /*防止重复回答*/
  45. if($loginUser->isAnswered($question->id)){
  46. return $this->showErrorMsg(route('ask.question.detail',['id'=>$question->id]),'您已经回答过该问题了,不能重复回答!');
  47. }
  48. /*普通用户修改需要输入验证码*/
  49. if( Setting()->get('code_create_answer') ){
  50. $captchaService->setValidateRules('code_create_answer',$this->validateRules);
  51. }
  52. $this->validate($request,$this->validateRules);
  53. $answerContent = clean($request->input('content'));
  54. $data = [
  55. 'user_id' => $loginUser->id,
  56. 'question_id' => $question_id,
  57. 'question_title' => $question->title,
  58. 'content' => $answerContent,
  59. 'status' => 1,
  60. ];
  61. $answer = Answer::create($data);
  62. if($answer){
  63. /*用户回答数+1*/
  64. $loginUser->userData()->increment('answers');
  65. /*问题回答数+1*/
  66. $question->increment('answers');
  67. UserTag::multiIncrement($loginUser->id,$question->tags()->get(),'answers');
  68. /*记录动态*/
  69. $this->doing($answer->user_id,'answer',get_class($question),$question->id,$question->title,$answer->content);
  70. /*记录通知*/
  71. $this->notify($answer->user_id,$question->user_id,'answer',$question->title,$question->id,$answer->content);
  72. /*回答后通知关注问题*/
  73. if(intval($request->input('followed'))){
  74. $attention = Attention::where("user_id",'=',$request->user()->id)->where('source_type','=',get_class($question))->where('source_id','=',$question->id)->count();
  75. if($attention===0){
  76. $data = [
  77. 'user_id' => $request->user()->id,
  78. 'source_id' => $question->id,
  79. 'source_type' => get_class($question),
  80. 'subject' => $question->title,
  81. ];
  82. Attention::create($data);
  83. $question->increment('followers');
  84. }
  85. }
  86. /*修改问题邀请表的回答状态*/
  87. QuestionInvitation::where('question_id','=',$question->id)->where('user_id','=',$request->user()->id)->update(['status'=>1]);
  88. $this->counter( 'answer_num_'. $answer->user_id , 1 , 60 );
  89. /*记录积分*/
  90. if($answer->status ==1 && $this->credit($request->user()->id,'answer',Setting()->get('coins_answer'),Setting()->get('credits_answer'),$question->id,$question->title)){
  91. $message = '回答成功! '.get_credit_message(Setting()->get('credits_answer'),Setting()->get('coins_answer'));
  92. return $this->success(route('ask.question.detail',['question_id'=>$answer->question_id]),$message);
  93. }
  94. }
  95. return redirect(route('ask.question.detail',['id'=>$question_id]));
  96. }
  97. public function edit($id,Request $request)
  98. {
  99. $answer = Answer::findOrFail($id);
  100. $this->authorize('update', $answer);
  101. /*编辑回答时效控制*/
  102. if(!Gate::allows('updateInTime',$answer)){
  103. return $this->showErrorMsg(route('ask.question.detail',['id'=>$answer->question_id]),'你已超过回答可编辑的最大时长,不能进行编辑了。如有疑问请联系管理员!');
  104. }
  105. return view("theme::question.edit_answer")->with('answer',$answer);
  106. }
  107. /*修改问题内容*/
  108. public function update($id,Request $request)
  109. {
  110. $answer = Answer::find($id);
  111. if(!$answer){
  112. abort(404);
  113. }
  114. $this->authorize('update', $answer);
  115. $request->flash();
  116. /*普通用户修改需要输入验证码*/
  117. if( Setting()->get('code_create_answer') ){
  118. $this->validateRules['captcha'] = 'required|captcha';
  119. }
  120. $this->validate($request,$this->validateRules);
  121. $answer->content = clean($request->input('content'));
  122. $answer->status = 1;
  123. $answer->save();
  124. return $this->success(route('ask.answer.detail',['question_id'=>$answer->question_id,'id'=>$answer->id]),"回答编辑成功");
  125. }
  126. public function adopt($id,Request $request)
  127. {
  128. $answer = Answer::find($id);
  129. if(!$answer){
  130. abort(404);
  131. }
  132. $this->authorize('adopt',$answer);
  133. $question = $answer->question;
  134. if(!$question){
  135. abort(404);
  136. }
  137. if( $question->status <= 0 ){
  138. return $this->error(route('ask.question.detail',['question_id'=>$answer->question_id]),'问题未通过审核,不能采纳答案!');
  139. }
  140. /*防止重复采纳*/
  141. if($answer->adopted_at){
  142. return $this->error(route('ask.question.detail',['question_id'=>$answer->question_id]),'该回答已被采纳,不能重复采纳');
  143. }
  144. $result = QuestionService::adoptAnswer($answer->id);
  145. /*悬赏处理*/
  146. $percent = Setting()->get('best_answer_percent',100) / 100;
  147. $earning = ceil($answer->question->price * $percent) + Setting()->get('coins_adopted',0);
  148. if($result){
  149. return $this->success(route('ask.question.detail',['question_id'=>$answer->question_id]),"回答采纳成功!".get_credit_message(Setting()->get('credits_adopted'),$earning));
  150. }
  151. return $this->error(route('ask.question.detail',['question_id'=>$answer->question_id]),"回答采纳失败,请稍后再试!");
  152. }
  153. /**
  154. * 回答详情查看
  155. */
  156. public function detail($question_id,$id,Request $request)
  157. {
  158. $question = Question::findOrFail($question_id);
  159. /*问题查看数+1*/
  160. $question->increment('views');
  161. $answer = $question->answers()->find($id);
  162. /*设置通知为已读*/
  163. if($request->user()){
  164. $this->readNotifications($answer->id,'answer');
  165. }
  166. /*相关问题*/
  167. $relatedQuestions = Question::correlations($question->tags()->pluck('tag_id'));
  168. return view("theme::answer.detail")->with('question',$question)
  169. ->with('answer',$answer)
  170. ->with('relatedQuestions',$relatedQuestions);
  171. }
  172. }