UserDictController.php 14 KB

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