| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580 |
- <?php
- namespace App\Http\Controllers;
- use App\Models\DhammaTerm;
- use App\Models\Channel;
- use Illuminate\Http\Request;
- use Illuminate\Support\Facades\Cache;
- use Illuminate\Support\Facades\DB;
- use Illuminate\Support\Str;
- use App\Http\Api\AuthApi;
- use App\Http\Api\StudioApi;
- use App\Http\Api\ChannelApi;
- use App\Http\Api\ShareApi;
- use App\Tools\Tools;
- use App\Http\Resources\TermResource;
- use Illuminate\Support\Facades\App;
- use PhpOffice\PhpSpreadsheet\Spreadsheet;
- use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
- use Illuminate\Support\Facades\Log;
- class DhammaTermController extends Controller
- {
- /**
- * Display a listing of the resource.
- *
- * @return \Illuminate\Http\Response
- */
- public function index(Request $request)
- {
- $result=false;
- $indexCol = ['id','guid','word','meaning','other_meaning','note','tag','language','channal','owner','editor_id','created_at','updated_at'];
- switch ($request->get('view')) {
- case 'create-by-channel':
- # 新建术语时。根据术语所在channel 给出新建术语所需数据。如语言,备选意思等。
- #获取channel信息
- $currChannel = Channel::where('uid',$request->get('channel'))->first();
- if(!$currChannel){
- return $this->error(__('auth.failed'));
- }
- #TODO 查询studio信息
- #获取同studio的channel列表
- $studioChannels = Channel::where('owner_uid',$currChannel->owner_uid)
- ->select(['name','uid'])
- ->get();
- #获取全网意思列表
- $meanings = DhammaTerm::where('word',$request->get('word'))
- ->where('language',$currChannel->lang)
- ->select(['meaning','other_meaning'])
- ->get();
- $meaningList=[];
- foreach ($meanings as $key => $value) {
- # code...
- $meaning1 = [$value->meaning];
- if(!empty($value->other_meaning)){
- $meaning2 = \explode(',',$value->other_meaning);
- $meaning1 = array_merge($meaning1,$meaning2);
- }
- foreach ($meaning1 as $key => $value) {
- # code...
- if(isset($meaningList[$value])){
- $meaningList[$value]++;
- }else{
- $meaningList[$value] = 1;
- }
- }
- }
- $meaningCount = [];
- foreach ($meaningList as $key => $value) {
- # code...
- $meaningCount[] = ['meaning'=>$key,'count'=>$value];
- }
- return $this->ok([
- "word"=>$request->get('word'),
- "meaningCount"=>$meaningCount,
- "studioChannels"=>$studioChannels,
- "language"=>$currChannel->lang,
- 'studio'=>StudioApi::getById($currChannel->owner_uid),
- ]);
- break;
- case 'studio':
- # 获取 studio 内所有 term
- $user = AuthApi::current($request);
- if(!$user){
- return $this->error(__('auth.failed'),[],401);
- }
- //判断当前用户是否有指定的studio的权限
- if($user['user_uid'] !== StudioApi::getIdByName($request->get('name'))){
- return $this->error(__('auth.failed'),[],403);
- }
- $table = DhammaTerm::select($indexCol)
- ->where('owner', $user["user_uid"]);
- break;
- case 'channel':
- # 获取 studio 内所有 term
- $user = AuthApi::current($request);
- if(!$user){
- return $this->error(__('auth.failed'));
- }
- //判断当前用户是否有指定的 channel 的权限
- $channel = Channel::find($request->get('id'));
- if($user['user_uid'] !== $channel->owner_uid ){
- //看是否为协作
- $power = ShareApi::getResPower($user['user_uid'],$request->get('id'));
- if($power === 0){
- return $this->error(__('auth.failed'),[],403);
- }
- }
- $table = DhammaTerm::select($indexCol)
- ->where('channal', $request->get('id'));
- break;
- case 'show':
- return $this->ok(DhammaTerm::find($request->get('id')));
- break;
- case 'user':
- # code...
- $userUid = $_COOKIE['user_uid'];
- $search = $request->get('search');
- $table = DhammaTerm::select($indexCol)
- ->where('owner', $userUid);
- break;
- case 'word':
- $table = DhammaTerm::select($indexCol)
- ->where('word', $request->get("word"));
- break;
- case 'hot-meaning':
- $key='term/hot_meaning';
- $value = Cache::get($key, function()use($request) {
- $hotMeaning=[];
- $words = DhammaTerm::select('word')
- ->where('language',$request->get("language"))
- ->groupby('word')
- ->get();
- foreach ($words as $key => $word) {
- # code...
- $result = DhammaTerm::select(DB::raw('count(*) as word_count, meaning'))
- ->where('language',$request->get("language"))
- ->where('word',$word['word'])
- ->groupby('meaning')
- ->orderby('word_count','desc')
- ->first();
- if($result){
- $hotMeaning[]=[
- 'word'=>$word['word'],
- 'meaning'=>$result['meaning'],
- 'language'=>$request->get("language"),
- 'owner'=>'',
- ];
- }
- }
- Cache::put($key, $hotMeaning, 3600);
- return $hotMeaning;
- }, env('CACHE_EXPIRE',3600*24));
- return $this->ok(["rows"=>$value,"count"=>count($value)]);
- break;
- default:
- # code...
- break;
- }
- $search = $request->get('search');
- if(!empty($search)){
- $table = $table->where(function($query) use($search){
- $query->where('word', 'like', $search."%")
- ->orWhere('word_en', 'like', $search."%")
- ->orWhere('meaning', 'like', "%".$search."%");
- });
- }
- $count = $table->count();
- $table = $table->orderBy($request->get('order','updated_at'),$request->get('dir','desc'));
- $table = $table->skip($request->get("offset",0))
- ->take($request->get('limit',1000));
- $result = $table->get();
- if($result){
- return $this->ok(["rows"=>TermResource::collection($result),"count"=>$count]);
- }else{
- return $this->error("没有查询到数据");
- }
- }
- /**
- * Store a newly created resource in storage.
- *
- * @param \Illuminate\Http\Request $request
- * @return \Illuminate\Http\Response
- */
- public function store(Request $request)
- {
- $user = AuthApi::current($request);
- if(!$user){
- return $this->error(__('auth.failed'));
- }
- $validated = $request->validate([
- 'word' => 'required',
- 'meaning' => 'required',
- 'language' => 'required'
- ]);
- #查询重复的
- /*
- 重复判定:
- 一个channel下面word+tag+language 唯一
- */
- $table = DhammaTerm::where('owner', $user["user_uid"])
- ->where('word',$request->get("word"))
- ->where('tag',$request->get("tag"));
- if($request->get("channel")){
- $isDoesntExist = $table->where('channel',$request->get("channel"))
- ->doesntExist();
- }else{
- $isDoesntExist = $table->where('language',$request->get("language"))
- ->doesntExist();
- }
- if($isDoesntExist){
- #不存在插入数据
- $term = new DhammaTerm;
- $term->id = app('snowflake')->id();
- $term->guid = Str::uuid();
- $term->word = $request->get("word");
- $term->word_en = Tools::getWordEn($request->get("word"));
- $term->meaning = $request->get("meaning");
- $term->other_meaning = $request->get("other_meaning");
- $term->note = $request->get("note");
- $term->tag = $request->get("tag");
- $term->channal = $request->get("channal");
- $term->language = $request->get("language");
- if($request->has("channal")){
- $channelInfo = ChannelApi::getById($request->get("channal"));
- if(!$channelInfo){
- return $this->error("channel id failed");
- }else{
- $term->owner = $channelInfo['studio_id'];
- }
- }else{
- $term->owner = StudioApi::getIdByName($request->get("studioName"));
- }
- $term->editor_id = $user["user_id"];
- $term->create_time = time()*1000;
- $term->modify_time = time()*1000;
- $term->save();
- return $this->ok($term);
- }else{
- return $this->error("word existed",[],200);
- }
- }
- /**
- * Display the specified resource.
- *
- * @param string $id
- * @return \Illuminate\Http\Response
- */
- public function show(Request $request,$id)
- {
- //
- $result = DhammaTerm::where('guid', $id)->first();
- if($result){
- return $this->ok(new TermResource($result));
- }else{
- return $this->error("没有查询到数据");
- }
- }
- /**
- * Update the specified resource in storage.
- *
- * @param \Illuminate\Http\Request $request
- * @param \App\Models\DhammaTerm $dhammaTerm
- * @return \Illuminate\Http\Response
- */
- public function update(Request $request, string $id)
- {
- //
- $user = AuthApi::current($request);
- if(!$user){
- return $this->error(__('auth.failed'));
- }
- //TODO 权限判断
- $dhammaTerm = DhammaTerm::find($id);
- $dhammaTerm->word = $request->get("word");
- $dhammaTerm->word_en = Tools::getWordEn($request->get("word"));
- $dhammaTerm->meaning = $request->get("meaning");
- $dhammaTerm->other_meaning = $request->get("other_meaning");
- $dhammaTerm->note = $request->get("note");
- $dhammaTerm->tag = $request->get("tag");
- $dhammaTerm->channal = $request->get("channal");
- $dhammaTerm->language = $request->get("language");
- if($request->has("channal") && Str::isUuid($request->get("channal"))){
- $channelInfo = ChannelApi::getById($request->get("channal"));
- if(!$channelInfo){
- return $this->error("channel id failed");
- }else{
- $dhammaTerm->owner = $channelInfo['studio_id'];
- }
- }
- if($request->has("studioName")){
- $dhammaTerm->owner = StudioApi::getIdByName($request->get("studioName"));
- }else if($request->has("studioId")){
- $dhammaTerm->owner = $request->get("studioId");
- }
- $dhammaTerm->editor_id = $user["user_id"];
- $dhammaTerm->create_time = time()*1000;
- $dhammaTerm->modify_time = time()*1000;
- $dhammaTerm->save();
- return $this->ok($dhammaTerm);
- }
- /**
- * Remove the specified resource from storage.
- *
- * @param \App\Models\DhammaTerm $dhammaTerm
- * @return \Illuminate\Http\Response
- */
- public function destroy(DhammaTerm $dhammaTerm,Request $request)
- {
- /**
- * 一次删除多个单词
- */
- $user = AuthApi::current($request);
- if(!$user){
- return $this->error(__('auth.failed'));
- }
- $count = 0;
- if($request->has("uuid")){
- //查看是否有删除权限
- foreach ($request->get("id") as $key => $uuid) {
- $term = DhammaTerm::find($uuid);
- if($term->owner !== $user['user_uid']){
- if(!empty($term->channal)){
- //看是否为协作
- $power = ShareApi::getResPower($user['user_uid'],$term->channal);
- if($power < 20){
- continue;
- }
- }else{
- continue;
- }
- }
- $count += $term->delete();
- }
- }else{
- $arrId = json_decode($request->get("id"),true) ;
- foreach ($arrId as $key => $id) {
- # code...
- $result = DhammaTerm::where('id', $id)
- ->where('owner', $user['user_uid'])
- ->delete();
- if($result){
- $count++;
- }
- }
- }
- return $this->ok($count);
- }
- public function export(Request $request){
- $user = AuthApi::current($request);
- if(!$user){
- return $this->error(__('auth.failed'));
- }
- //TODO 判断是否有导出权限
- switch ($request->get("view")) {
- case 'channel':
- # code...
- $rows = DhammaTerm::where('channal',$request->get("id"))->cursor();
- break;
- case 'studio':
- # code...
- $studioId = StudioApi::getIdByName($request->get("name"));
- $rows = DhammaTerm::where('owner',$studioId)->cursor();
- break;
- default:
- $this->error('no view');
- break;
- }
- $spreadsheet = new Spreadsheet();
- $activeWorksheet = $spreadsheet->getActiveSheet();
- $activeWorksheet->setCellValue('A1', 'id');
- $activeWorksheet->setCellValue('B1', 'word');
- $activeWorksheet->setCellValue('C1', 'meaning');
- $activeWorksheet->setCellValue('D1', 'other_meaning');
- $activeWorksheet->setCellValue('E1', 'note');
- $activeWorksheet->setCellValue('F1', 'tag');
- $activeWorksheet->setCellValue('G1', 'language');
- $activeWorksheet->setCellValue('H1', 'channel_id');
- $currLine = 2;
- foreach ($rows as $key => $row) {
- # code...
- $activeWorksheet->setCellValue("A{$currLine}", $row->guid);
- $activeWorksheet->setCellValue("B{$currLine}", $row->word);
- $activeWorksheet->setCellValue("C{$currLine}", $row->meaning);
- $activeWorksheet->setCellValue("D{$currLine}", $row->other_meaning);
- $activeWorksheet->setCellValue("E{$currLine}", $row->note);
- $activeWorksheet->setCellValue("F{$currLine}", $row->tag);
- $activeWorksheet->setCellValue("G{$currLine}", $row->language);
- $activeWorksheet->setCellValue("H{$currLine}", $row->channal);
- $currLine++;
- }
- $writer = new Xlsx($spreadsheet);
- $fId = Str::uuid();
- $filename = storage_path("app/tmp/{$fId}");
- $writer->save($filename);
- Cache::put("download/tmp/{$fId}",file_get_contents($filename),300);
- unlink($filename);
- return $this->ok(['uuid'=>$fId,'filename'=>"term.xlsx",'type'=>"application/vnd.ms-excel"]);
- }
- public function import(Request $request){
- $user = AuthApi::current($request);
- if(!$user){
- return $this->error(__('auth.failed'));
- }
- /**
- * 判断是否有权限
- */
- switch ($request->get('view')) {
- case 'channel':
- # 向channel里面导入,忽略源数据的channel id 和 owner 都设置为这个channel 的
- $channel = ChannelApi::getById($request->get('id'));
- $owner_id = $channel['studio_id'];
- if($owner_id !== $user["user_uid"]){
- //判断是否为协作
- $power = ShareApi::getResPower($user["user_uid"],$request->get('id'));
- if($power<20){
- return $this->error(__('auth.failed'),[],403);
- }
- }
- $language = $channel['lang'];
- break;
- case 'studio':
- # 向 studio 里面导入,忽略源数据的 owner 但是要检测 channel id 是否有权限
- $owner_id = StudioApi::getIdByName($request->get('name'));
- if(!$owner_id){
- return $this->error('no studio name',[],403);
- }
- break;
- }
- $message = "";
- $filename = $request->get('filename');
- $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
- $reader->setReadDataOnly(true);
- $spreadsheet = $reader->load($filename);
- $activeWorksheet = $spreadsheet->getActiveSheet();
- $currLine = 2;
- $countFail = 0;
- do {
- # code...
- $id = $activeWorksheet->getCell("A{$currLine}")->getValue();
- $word = $activeWorksheet->getCell("B{$currLine}")->getValue();
- $meaning = $activeWorksheet->getCell("C{$currLine}")->getValue();
- $other_meaning = $activeWorksheet->getCell("D{$currLine}")->getValue();
- $note = $activeWorksheet->getCell("E{$currLine}")->getValue();
- $tag = $activeWorksheet->getCell("F{$currLine}")->getValue();
- $language = $activeWorksheet->getCell("G{$currLine}")->getValue();
- $channel_id = $activeWorksheet->getCell("H{$currLine}")->getValue();
- $query = ['word'=>$word,'tag'=>$tag];
- $channelId = null;
- switch ($request->get('view')) {
- case 'channel':
- # 向channel里面导入,忽略源数据的channel id 和 owner 都设置为这个channel 的
- $query['channal'] = $request->get('id');
- $channelId = $request->get('id');
- break;
- case 'studio':
- # 向 studio 里面导入,忽略源数据的owner 但是要检测 channel id 是否有权限
- $query['owner'] = $owner_id;
- if(!empty($channel_id)){
- //有channel 数据,查看是否在studio中
- $channel = ChannelApi::getById($channel_id);
- if($channel === false){
- $message .= "没有查到版本信息:{$channel_id} - {$word}\n";
- $currLine++;
- $countFail++;
- continue 2;
- }
- if($owner_id != $channel['studio_id']){
- $message .= "版本不在studio中:{$channel_id} - {$word}\n";
- $currLine++;
- $countFail++;
- continue 2;
- }
- $query['channal'] = $channel_id;
- $channelId = $channel_id;
- }
- # code...
- break;
- }
- if(empty($id) && empty($word)){
- break;
- }
- //查询此id是否有旧数据
- if(!empty($id)){
- $oldRow = DhammaTerm::find($id);
- //TODO 有 id 无 word 删除数据
- if(empty($word)){
- //查看权限
- if($oldRow->owner !== $user['user_uid']){
- if(!empty($oldRow->channal)){
- //看是否为协作
- $power = ShareApi::getResPower($user['user_uid'],$oldRow->channal);
- if($power < 20){
- $message .= "无删除权限:{$id} - {$word}\n";
- $currLine++;
- $countFail++;
- continue;
- }
- }else{
- $message .= "无删除权限:{$id} - {$word}\n";
- $currLine++;
- $countFail++;
- continue;
- }
- }
- //删除
- $oldRow->delete();
- $currLine++;
- continue;
- }
- }else{
- $oldRow = null;
- }
- //查询是否跟已有数据重复
- $row = DhammaTerm::where($query)->first();
- if(!$row){
- //不重复
- if(isset($oldRow) && $oldRow){
- //找到旧的记录-修改旧数据
- $row = $oldRow;
- }else{
- //没找到旧的记录-新建
- $row = new DhammaTerm();
- $row->id = app('snowflake')->id();
- $row->guid = Str::uuid();
- $row->word = $word;
- $row->create_time = time()*1000;
- }
- }else{
- //重复-如果与旧的id不同,报错
- if(isset($oldRow) && $oldRow && $row->guid !== $id){
- $message .= "重复的数据:{$id} - {$word}\n";
- $currLine++;
- $countFail++;
- continue;
- }
- }
- $row->word = $word;
- $row->word_en = Tools::getWordEn($word);
- $row->meaning = $meaning;
- $row->other_meaning = $other_meaning;
- $row->note = $note;
- $row->tag = $tag;
- $row->language = $language;
- $row->channal = $channelId;
- $row->editor_id = $user['user_id'];
- $row->owner = $owner_id;
- $row->modify_time = time()*1000;
- $row->save();
- $currLine++;
- } while (true);
- return $this->ok(["success"=>$currLine-2-$countFail,'fail'=>($countFail)],$message);
- }
- }
|