UserDictController.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Models\UserDict;
  4. use App\Models\DictInfo;
  5. use Illuminate\Http\Request;
  6. use Illuminate\Support\Facades\Redis;
  7. use Illuminate\Support\Facades\Log;
  8. use App\Http\Api;
  9. use App\Http\Api\AuthApi;
  10. use App\Http\Api\DictApi;
  11. use App\Http\Resources\UserDictResource;
  12. use Illuminate\Support\Str;
  13. class UserDictController 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. $result=false;
  24. $indexCol = ['id','word','type','grammar',
  25. 'mean','parent','note',
  26. 'factors','confidence','dict_id',
  27. 'updated_at','creator_id'];
  28. switch ($request->get('view')) {
  29. case 'all':
  30. # 获取studio内所有channel
  31. $user = AuthApi::current($request);
  32. if(!$user){
  33. return $this->error(__('auth.failed'));
  34. }
  35. $table = UserDict::select($indexCol);
  36. break;
  37. case 'studio':
  38. # 获取studio内所有channel
  39. $user = AuthApi::current($request);
  40. if(!$user){
  41. return $this->error(__('auth.failed'));
  42. }
  43. //判断当前用户是否有指定的studio的权限
  44. if($user['user_uid'] !== \App\Http\Api\StudioApi::getIdByName($request->get('name'))){
  45. return $this->error(__('auth.failed'));
  46. }
  47. $table = UserDict::select($indexCol)
  48. ->where('creator_id', $user["user_id"])
  49. ->whereIn('source', ["_USER_WBW_","_USER_DICT_"]);
  50. break;
  51. case 'user':
  52. # code...
  53. $table = UserDict::select($indexCol)
  54. ->where('creator_id', $_COOKIE["user_id"])
  55. ->where('source', '<>', "_SYS_USER_WBW_");
  56. break;
  57. case 'word':
  58. $table = UserDict::select($indexCol)
  59. ->where('word', $request->get("word"));
  60. break;
  61. case 'community':
  62. $table = UserDict::select($indexCol)
  63. ->where('word', $request->get("word"))
  64. ->where(function($query) {
  65. $query->where('source', "_USER_WBW_")
  66. ->orWhere('source','_USER_DICT_');
  67. });
  68. break;
  69. case 'compound':
  70. $dict_id = DictApi::getSysDict('robot_compound');
  71. if($dict_id===false){
  72. $this->error('no robot_compound');
  73. }
  74. $table = UserDict::where("dict_id",$dict_id)->where("word",$request->get('word'));
  75. break;
  76. case 'dict':
  77. $dict_id = false;
  78. if($request->has('name')){
  79. $dict_id = DictApi::getSysDict($request->get('name'));
  80. }else if($request->has('id')){
  81. $dict_id = $request->get('id');
  82. }
  83. if($dict_id===false){
  84. $this->error('no dict',[],404);
  85. }
  86. $table = UserDict::select($indexCol)
  87. ->where("dict_id",$dict_id);
  88. default:
  89. # code...
  90. break;
  91. }
  92. if($request->has("search")){
  93. $table->where('word', 'like', $request->get("search")."%");
  94. }
  95. if(($request->has('word'))){
  96. $table = $table->where('word',$request->get('word'));
  97. }
  98. if(($request->has('parent'))){
  99. $table = $table->where('parent',$request->get('parent'));
  100. }
  101. if(($request->has('dict'))){
  102. $dictId = DictInfo::where('shortname',$request->get('dict'))->value('id');
  103. if(Str::isUuid($dictId)){
  104. $table = $table->where('dict_id',$dictId);
  105. }
  106. }
  107. $count = $table->count();
  108. $table->orderBy($request->get('order','updated_at'),
  109. $request->get('dir','desc'));
  110. $table->skip($request->get('offset',0))
  111. ->take($request->get('limit',200));
  112. $result = $table->get();
  113. return $this->ok(["rows"=>UserDictResource::collection($result),"count"=>$count]);
  114. }
  115. /**
  116. * Store a newly created resource in storage.
  117. *
  118. * @param \Illuminate\Http\Request $request
  119. * @return \Illuminate\Http\Response
  120. */
  121. public function store(Request $request)
  122. {
  123. //
  124. $user = AuthApi::current($request);
  125. if(!$user){
  126. $this->error("not login");
  127. }
  128. $_data = json_decode($request->get("data"),true);
  129. switch($request->get('view')){
  130. case "dict":
  131. $src = "_USER_DICT_";
  132. break;
  133. case "wbw":
  134. $src = "_USER_WBW_";
  135. break;
  136. default:
  137. $this->error("not view");
  138. break;
  139. }
  140. #查询用户重复的数据
  141. $iOk = 0;
  142. $updateOk=0;
  143. foreach ($_data as $key => $word) {
  144. # code...
  145. $table = UserDict::where('creator_id', $user["user_id"])
  146. ->where('word',$word["word"]);
  147. if(isset($word["type"])){$table = $table->where('type',$word["type"]);}
  148. if(isset($word["grammar"])){$table = $table->where('grammar',$word["grammar"]);}
  149. if(isset($word["parent"])){$table = $table->where('parent',$word["parent"]);}
  150. if(isset($word["mean"])){$table = $table->where('mean',$word["mean"]);}
  151. if(isset($word["factors"])){$table = $table->where('factors',$word["factors"]);}
  152. $isDoesntExist = $table->doesntExist();
  153. if($isDoesntExist){
  154. #不存在插入数据
  155. $word["id"]=app('snowflake')->id();
  156. $word["source"] = $src;
  157. $word["create_time"] = time()*1000;
  158. $word["creator_id"]=$user["user_id"];
  159. $id = UserDict::insert($word);
  160. $updateOk = $this->update_sys_wbw($word);
  161. $this->update_redis($word);
  162. $iOk++;
  163. }
  164. }
  165. return $this->ok([$iOk,$updateOk]);
  166. }
  167. /**
  168. * Display the specified resource.
  169. *
  170. * @param int $id
  171. * @return \Illuminate\Http\Response
  172. */
  173. public function show($id)
  174. {
  175. //
  176. $result = UserDict::find($id);
  177. if($result){
  178. return $this->ok($result);
  179. }else{
  180. return $this->error("没有查询到数据");
  181. }
  182. }
  183. /**
  184. * Update the specified resource in storage.
  185. *
  186. * @param \Illuminate\Http\Request $request
  187. * @param int $id
  188. * @return \Illuminate\Http\Response
  189. */
  190. public function update(Request $request, $id)
  191. {
  192. //
  193. $newData = $request->all();
  194. $result = UserDict::where('id', $id)
  195. ->update($newData);
  196. if($result){
  197. $updateOk = $this->update_sys_wbw($newData);
  198. $this->update_redis($newData);
  199. return $this->ok([$result,$updateOk]);
  200. }else{
  201. return $this->error("没有查询到数据");
  202. }
  203. }
  204. /**
  205. * Remove the specified resource from storage.
  206. * @param \Illuminate\Http\Request $request
  207. * @param int $id
  208. * @return \Illuminate\Http\Response
  209. */
  210. public function destroy(Request $request,$id)
  211. {
  212. //
  213. $user = AuthApi::current($request);
  214. if(!$user){
  215. return $this->error(__('auth.failed'),[],403);
  216. }
  217. $user_id = $user['user_id'];
  218. if($request->has("id")){
  219. $arrId = json_decode($request->get("id"),true) ;
  220. $count = 0;
  221. $updateOk = false;
  222. foreach ($arrId as $key => $id) {
  223. # 找到对应数据
  224. $data = UserDict::find($id);
  225. //查看是否有权限删除
  226. if($data->creator_id == $user_id){
  227. $result = UserDict::where('id', $id)
  228. ->delete();
  229. $count += $result;
  230. $updateOk = $this->update_sys_wbw($data);
  231. $this->update_redis($data);
  232. }
  233. }
  234. return $this->ok([$count,$updateOk]);
  235. }else{
  236. //删除单个单词
  237. $userDict = UserDict::find($id);
  238. //判断当前用户是否有指定的studio的权限
  239. if((int)$user_id !== $userDict->creator_id){
  240. return $this->error(__('auth.failed'));
  241. }
  242. $delete = $userDict->delete();
  243. return $this->ok($delete);
  244. }
  245. }
  246. public function delete(Request $request){
  247. $arrId = json_decode($request->get("id"),true) ;
  248. $count = 0;
  249. $updateOk = false;
  250. foreach ($arrId as $key => $id) {
  251. $data = UserDict::where('id',$id)->first();
  252. if($data){
  253. # 找到对应数据
  254. $param = [
  255. "id"=>$id,
  256. 'creator_id'=>$_COOKIE["user_id"]
  257. ];
  258. $del = UserDict::where($param)->delete();
  259. $count += $del;
  260. $updateOk = $this->update_sys_wbw($data);
  261. $this->update_redis($data);
  262. }
  263. }
  264. return $this->ok(['deleted'=>$count]);
  265. }
  266. /*
  267. 更新系统wbw汇总表
  268. */
  269. private function update_sys_wbw($data){
  270. #查询用户重复的数据
  271. if(!isset($data["type"])){$data["type"]=null;}
  272. if(!isset($data["grammar"])){$data["grammar"]=null;}
  273. if(!isset($data["parent"])){$data["parent"]=null;}
  274. if(!isset($data["mean"])){$data["mean"]=null;}
  275. if(!isset($data["factors"])){$data["factors"]=null;}
  276. if(!isset($data["factormean"])){$data["factormean"]=null;}
  277. $count = UserDict::where('word',$data["word"])
  278. ->where('type',$data["type"])
  279. ->where('grammar',$data["grammar"])
  280. ->where('parent',$data["parent"])
  281. ->where('mean',$data["mean"])
  282. ->where('factors',$data["factors"])
  283. ->where('factormean',$data["factormean"])
  284. ->where('source',$data["source"])
  285. ->count();
  286. if($count === 0){
  287. # 没有任何用户有这个数据
  288. #删除数据
  289. $result = UserDict::where('word',$data["word"])
  290. ->where('type',$data["type"])
  291. ->where('grammar',$data["grammar"])
  292. ->where('parent',$data["parent"])
  293. ->where('mean',$data["mean"])
  294. ->where('factors',$data["factors"])
  295. ->where('factormean',$data["factormean"])
  296. ->where('source','_SYS_USER_WBW_')
  297. ->delete();
  298. return($result);
  299. }else{
  300. #更新或新增
  301. #查询最早上传这个数据的用户
  302. $creator_id = UserDict::where('word',$data["word"])
  303. ->where('type',$data["type"])
  304. ->where('grammar',$data["grammar"])
  305. ->where('parent',$data["parent"])
  306. ->where('mean',$data["mean"])
  307. ->where('factors',$data["factors"])
  308. ->where('factormean',$data["factormean"])
  309. ->whereIn('source',['_USER_WBW_','_USER_DICT_'])
  310. ->orderby("created_at",'asc')
  311. ->value("creator_id");
  312. $count = UserDict::where('word',$data["word"])
  313. ->where('type',$data["type"])
  314. ->where('grammar',$data["grammar"])
  315. ->where('parent',$data["parent"])
  316. ->where('mean',$data["mean"])
  317. ->where('factors',$data["factors"])
  318. ->where('factormean',$data["factormean"])
  319. ->where('source','_SYS_USER_WBW_')
  320. ->count();
  321. if($count === 0){
  322. #社区字典没有 新增
  323. $result = UserDict::insert(
  324. [
  325. 'id' =>app('snowflake')->id(),
  326. 'word'=>$data["word"],
  327. 'type'=>$data["type"],
  328. 'grammar'=>$data["grammar"],
  329. 'parent'=>$data["parent"],
  330. 'mean'=>$data["mean"],
  331. 'factors'=>$data["factors"],
  332. 'factormean'=>$data["factormean"],
  333. 'language'=>$data["language"],
  334. 'source'=>"_SYS_USER_WBW_",
  335. 'creator_id' => $data["creator_id"],
  336. 'ref_counter' => 1,
  337. 'dict_id' => DictApi::getSysDict('community_extract'),
  338. "create_time"=>time()*1000
  339. ]);
  340. }else{
  341. #有,更新
  342. $result = UserDict::where('word',$data["word"])
  343. ->where('type',$data["type"])
  344. ->where('grammar',$data["grammar"])
  345. ->where('parent',$data["parent"])
  346. ->where('mean',$data["mean"])
  347. ->where('factors',$data["factors"])
  348. ->where('factormean',$data["factormean"])
  349. ->where('source','_SYS_USER_WBW_')
  350. ->update(
  351. [
  352. 'creator_id'=>$creator_id,
  353. 'ref_counter'=>$count
  354. ]);
  355. }
  356. return($result);
  357. }
  358. }
  359. private function update_redis($word){
  360. #更新 redis
  361. $Fetch = UserDict::where(['word'=>$word['word'],"source"=>"_USER_WBW_"])->get();
  362. $redisWord=array();
  363. foreach ($Fetch as $one) {
  364. # code...
  365. $redisWord[] = array(
  366. $one["id"],
  367. $one["word"],
  368. $one["type"],
  369. $one["grammar"],
  370. $one["parent"],
  371. $one["mean"],
  372. $one["note"],
  373. $one["factors"],
  374. $one["factormean"],
  375. $one["status"],
  376. $one["confidence"],
  377. $one["creator_id"],
  378. $one["source"],
  379. $one["language"]
  380. );
  381. }
  382. $redisData = json_encode($redisWord,JSON_UNESCAPED_UNICODE);
  383. Redis::hSet("dict/user",$word['word'],$redisData);
  384. $redisData1 = Redis::hGet("dict/user",$word['word']);
  385. #更新redis结束
  386. }
  387. }