UserDictController.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  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. 'source','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. }else{
  164. //存在,修改数据
  165. $origin = $table->first();
  166. if(isset($word["note"])){
  167. $origin->note = $word["note"];
  168. }
  169. if(isset($word["confidence"])){
  170. $origin->confidence = $word["confidence"];
  171. }
  172. $origin->save();
  173. }
  174. }
  175. return $this->ok([$iOk,$updateOk]);
  176. }
  177. /**
  178. * Display the specified resource.
  179. *
  180. * @param int $id
  181. * @return \Illuminate\Http\Response
  182. */
  183. public function show($id)
  184. {
  185. //
  186. $result = UserDict::find($id);
  187. if($result){
  188. return $this->ok($result);
  189. }else{
  190. return $this->error("没有查询到数据");
  191. }
  192. }
  193. /**
  194. * Update the specified resource in storage.
  195. *
  196. * @param \Illuminate\Http\Request $request
  197. * @param int $id
  198. * @return \Illuminate\Http\Response
  199. */
  200. public function update(Request $request, $id)
  201. {
  202. //
  203. $newData = $request->all();
  204. $result = UserDict::where('id', $id)
  205. ->update($newData);
  206. if($result){
  207. $updateOk = $this->update_sys_wbw($newData);
  208. $this->update_redis($newData);
  209. return $this->ok([$result,$updateOk]);
  210. }else{
  211. return $this->error("没有查询到数据");
  212. }
  213. }
  214. /**
  215. * Remove the specified resource from storage.
  216. * @param \Illuminate\Http\Request $request
  217. * @param int $id
  218. * @return \Illuminate\Http\Response
  219. */
  220. public function destroy(Request $request,$id)
  221. {
  222. //
  223. $user = AuthApi::current($request);
  224. if(!$user){
  225. return $this->error(__('auth.failed'),[],403);
  226. }
  227. $user_id = $user['user_id'];
  228. if($request->has("id")){
  229. $arrId = json_decode($request->get("id"),true) ;
  230. $count = 0;
  231. $updateOk = false;
  232. foreach ($arrId as $key => $id) {
  233. # 找到对应数据
  234. $data = UserDict::find($id);
  235. //查看是否有权限删除
  236. if($data->creator_id == $user_id){
  237. $result = UserDict::where('id', $id)
  238. ->delete();
  239. $count += $result;
  240. $updateOk = $this->update_sys_wbw($data);
  241. $this->update_redis($data);
  242. }
  243. }
  244. return $this->ok([$count,$updateOk]);
  245. }else{
  246. //删除单个单词
  247. $userDict = UserDict::find($id);
  248. //判断当前用户是否有指定的studio的权限
  249. if((int)$user_id !== $userDict->creator_id){
  250. return $this->error(__('auth.failed'));
  251. }
  252. $delete = $userDict->delete();
  253. return $this->ok($delete);
  254. }
  255. }
  256. public function delete(Request $request){
  257. $arrId = json_decode($request->get("id"),true) ;
  258. $count = 0;
  259. $updateOk = false;
  260. foreach ($arrId as $key => $id) {
  261. $data = UserDict::where('id',$id)->first();
  262. if($data){
  263. # 找到对应数据
  264. $param = [
  265. "id"=>$id,
  266. 'creator_id'=>$_COOKIE["user_id"]
  267. ];
  268. $del = UserDict::where($param)->delete();
  269. $count += $del;
  270. $updateOk = $this->update_sys_wbw($data);
  271. $this->update_redis($data);
  272. }
  273. }
  274. return $this->ok(['deleted'=>$count]);
  275. }
  276. /*
  277. 更新系统wbw汇总表
  278. */
  279. private function update_sys_wbw($data){
  280. #查询用户重复的数据
  281. if(!isset($data["type"])){$data["type"]=null;}
  282. if(!isset($data["grammar"])){$data["grammar"]=null;}
  283. if(!isset($data["parent"])){$data["parent"]=null;}
  284. if(!isset($data["mean"])){$data["mean"]=null;}
  285. if(!isset($data["factors"])){$data["factors"]=null;}
  286. if(!isset($data["factormean"])){$data["factormean"]=null;}
  287. $count = UserDict::where('word',$data["word"])
  288. ->where('type',$data["type"])
  289. ->where('grammar',$data["grammar"])
  290. ->where('parent',$data["parent"])
  291. ->where('mean',$data["mean"])
  292. ->where('factors',$data["factors"])
  293. ->where('factormean',$data["factormean"])
  294. ->where('source',$data["source"])
  295. ->count();
  296. if($count === 0){
  297. # 没有任何用户有这个数据
  298. #删除数据
  299. $result = UserDict::where('word',$data["word"])
  300. ->where('type',$data["type"])
  301. ->where('grammar',$data["grammar"])
  302. ->where('parent',$data["parent"])
  303. ->where('mean',$data["mean"])
  304. ->where('factors',$data["factors"])
  305. ->where('factormean',$data["factormean"])
  306. ->where('source','_SYS_USER_WBW_')
  307. ->delete();
  308. return($result);
  309. }else{
  310. #更新或新增
  311. #查询最早上传这个数据的用户
  312. $creator_id = 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. ->whereIn('source',['_USER_WBW_','_USER_DICT_'])
  320. ->orderby("created_at",'asc')
  321. ->value("creator_id");
  322. $count = UserDict::where('word',$data["word"])
  323. ->where('type',$data["type"])
  324. ->where('grammar',$data["grammar"])
  325. ->where('parent',$data["parent"])
  326. ->where('mean',$data["mean"])
  327. ->where('factors',$data["factors"])
  328. ->where('factormean',$data["factormean"])
  329. ->where('source','_SYS_USER_WBW_')
  330. ->count();
  331. if($count === 0){
  332. #社区字典没有 新增
  333. $result = UserDict::insert(
  334. [
  335. 'id' =>app('snowflake')->id(),
  336. 'word'=>$data["word"],
  337. 'type'=>$data["type"],
  338. 'grammar'=>$data["grammar"],
  339. 'parent'=>$data["parent"],
  340. 'mean'=>$data["mean"],
  341. 'factors'=>$data["factors"],
  342. 'factormean'=>$data["factormean"],
  343. 'language'=>$data["language"],
  344. 'source'=>"_SYS_USER_WBW_",
  345. 'creator_id' => $data["creator_id"],
  346. 'ref_counter' => 1,
  347. 'dict_id' => DictApi::getSysDict('community_extract'),
  348. "create_time"=>time()*1000
  349. ]);
  350. }else{
  351. #有,更新
  352. $result = UserDict::where('word',$data["word"])
  353. ->where('type',$data["type"])
  354. ->where('grammar',$data["grammar"])
  355. ->where('parent',$data["parent"])
  356. ->where('mean',$data["mean"])
  357. ->where('factors',$data["factors"])
  358. ->where('factormean',$data["factormean"])
  359. ->where('source','_SYS_USER_WBW_')
  360. ->update(
  361. [
  362. 'creator_id'=>$creator_id,
  363. 'ref_counter'=>$count
  364. ]);
  365. }
  366. return($result);
  367. }
  368. }
  369. private function update_redis($word){
  370. #更新 redis
  371. $Fetch = UserDict::where(['word'=>$word['word'],"source"=>"_USER_WBW_"])->get();
  372. $redisWord=array();
  373. foreach ($Fetch as $one) {
  374. # code...
  375. $redisWord[] = array(
  376. $one["id"],
  377. $one["word"],
  378. $one["type"],
  379. $one["grammar"],
  380. $one["parent"],
  381. $one["mean"],
  382. $one["note"],
  383. $one["factors"],
  384. $one["factormean"],
  385. $one["status"],
  386. $one["confidence"],
  387. $one["creator_id"],
  388. $one["source"],
  389. $one["language"]
  390. );
  391. }
  392. $redisData = json_encode($redisWord,JSON_UNESCAPED_UNICODE);
  393. Redis::hSet("dict/user",$word['word'],$redisData);
  394. $redisData1 = Redis::hGet("dict/user",$word['word']);
  395. #更新redis结束
  396. }
  397. }