fork_channel.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. <?php
  2. /*拷贝其他人的文件
  3. *
  4. *
  5. */
  6. require_once '../studio/index_head.php';
  7. ?>
  8. <body id="file_list_body" >
  9. <?php
  10. require_once "../path.php";
  11. require_once "../public/_pdo.php";
  12. require_once "../public/function.php";
  13. require_once "../channal/function.php";
  14. require_once "../redis/function.php";
  15. $redis = redis_connect();
  16. require_once '../studio/index_tool_bar.php';
  17. echo '<div class="index_inner" style=" margin-left: 18em;margin-top: 5em;">';
  18. if ($_COOKIE["uid"]) {
  19. $uid = $_COOKIE["uid"];
  20. } else {
  21. echo "尚未登录";
  22. echo "<h3><a href='../ucenter/index.php?op=login'>登录</a>后才可以打开文档 </h3>";
  23. exit;
  24. }
  25. if(isset($_GET["para"])){
  26. $_para = json_decode($_GET["para"]);
  27. }
  28. else{
  29. echo "没有 para 编号";
  30. exit;
  31. }
  32. if (isset($_GET["src_channel"]) == false) {
  33. echo "没有 channel 编号";
  34. exit;
  35. }
  36. //文档信息
  37. $mbook = $_GET["book"];
  38. $paragraph = implode(",",$_para);
  39. if (isset($_GET["dest_channel"]) == false) {
  40. echo '<div class="file_list_block">';
  41. echo "<h2>选择一个空白的版风存储新的文档</h2>";
  42. echo "<div>原有版本中相同段落的数据将被覆盖</div>";
  43. echo "<form action='fork_channel.php' method='get'>";
  44. echo "<input type='hidden' name='book' value='{$_GET["book"]}' />";
  45. echo "<input type='hidden' name='para' value='{$_GET["para"]}' />";
  46. echo "<input type='hidden' name='src_channel' value='{$_GET["src_channel"]}' />";
  47. PDO_Connect(_FILE_DB_CHANNAL_);
  48. $query = "select * from channal where owner = '{$_COOKIE["userid"]}' limit 0,100";
  49. $Fetch = PDO_FetchAll($query);
  50. $i = 0;
  51. PDO_Connect( _FILE_DB_USER_WBW_);
  52. foreach ($Fetch as $row) {
  53. echo '<div class="file_list_row" style="padding:5px;display:flex;">';
  54. echo '<div class="pd-10" style="max-width:2em;flex:1;">';
  55. echo '<input name="dest_channel" value="' . $row["id"] . '" ';
  56. if ($i == 0) {
  57. echo "checked";
  58. }
  59. echo ' type="radio" />';
  60. echo '</div>';
  61. echo '<div class="title" style="flex:3;padding-bottom:5px;">' . $row["name"] . '</div>';
  62. echo '<div class="title" style="flex:3;padding-bottom:5px;">' . $row["lang"] . '</div>';
  63. echo '<div class="title" style="flex:2;padding-bottom:5px;">';
  64. $query = "select count(*) from "._TABLE_USER_WBW_BLOCK_." where channal = '{$row["id"]}' and book='{$mbook}' and paragraph in ({$paragraph}) limit 0,100";
  65. $FetchWBW = PDO_FetchOne($query);
  66. echo '</div>';
  67. echo '<div class="title" style="flex:2;padding-bottom:5px;">';
  68. if ($FetchWBW == 0) {
  69. echo $_local->gui->blank;
  70. } else {
  71. echo $FetchWBW . $_local->gui->para;
  72. echo "<a href='../studio/editor.php?op=openchannal&book=$book&para={$paraList}&channal={$row["id"]}'>open</a>";
  73. }
  74. echo '</div>';
  75. echo '<div class="summary" style="flex:1;padding-bottom:5px;">' . $row["status"] . '</div>';
  76. echo '<div class="author" style="flex:1;padding-bottom:5px;">' . $row["create_time"] . '</div>';
  77. echo '</div>';
  78. $i++;
  79. }
  80. echo "<input type='submit' />";
  81. echo "</form>";
  82. echo "</div>";
  83. exit;
  84. }
  85. PDO_Connect( _FILE_DB_USER_WBW_);
  86. $channelInfo= new Channal($redis);
  87. $srcPower = (int)$channelInfo->getPower($_GET["src_channel"]);
  88. {
  89. {
  90. if ($srcPower == 30) {
  91. //自己的文档
  92. echo "这是自己的文档,不能复刻。";
  93. } else {
  94. //别人的文档
  95. //查询以前自己是否曾经复刻
  96. $query = "SELECT * from "._TABLE_USER_WBW_BLOCK_." where parent_channel=? and owner=? ";
  97. $FetchSelf = PDO_FetchAll($query,array($_GET["src_channel"],$_COOKIE["userid"]));
  98. $iFetchSelf = count($FetchSelf);
  99. if ($iFetchSelf > 0) {
  100. //以前打开过
  101. echo "文档已经复刻";
  102. echo "正在<a href='../studio/editor.php?op=openchannal&book={$_GET["book"]}&para={$_para[0]}&channal={$FetchSelf[0]["channal"]}'>打开</a>文档";
  103. echo "<script>";
  104. echo "window.location.assign(\"../studio/editor.php?op=openchannal&book={$_GET["book"]}&para={$_para[0]}&channal={$FetchSelf[0]["channal"]}\");";
  105. echo "</script>";
  106. } else {
  107. //以前没打开过
  108. echo "<h3>共享的文档,正在fork...</h3>";
  109. echo "<div style='display:none;'>";
  110. {
  111. //复制数据
  112. //打开逐词解析数据库
  113. $dns = _FILE_DB_USER_WBW_;
  114. $dbhWBW = new PDO($dns, "", "", array(PDO::ATTR_PERSISTENT => true));
  115. $dbhWBW->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
  116. //逐词解析新数据数组
  117. $arrNewBlock = array();
  118. $arrNewBlockData = array();
  119. $arrBlockTransform = array();
  120. $blocks = $_para;
  121. for ($i = 0; $i < count($blocks); $i++) {
  122. $query = "SELECT id from "._TABLE_USER_WBW_BLOCK_." where book= ? and paragraph = ? and channal = ? ";
  123. $stmt = $dbhWBW->prepare($query);
  124. $stmt->execute(array($_GET["book"],$iPara,$_GET["dest_channel"]));
  125. $fDest = $stmt->fetch(PDO::FETCH_ASSOC);
  126. if($fDest){
  127. #旧的逐词解析数据块wbw_block id
  128. $destId = $fDest["id"];
  129. }
  130. #逐词解析
  131. $iPara = $blocks[$i];
  132. $query = "SELECT * from "._TABLE_USER_WBW_BLOCK_." where book= ? and paragraph = ? and channal = ? ";
  133. $stmt = $dbhWBW->prepare($query);
  134. $stmt->execute(array($_GET["book"],$iPara,$_GET["src_channel"]));
  135. $fBlock = $stmt->fetchAll(PDO::FETCH_ASSOC);
  136. if(isset($destId)){
  137. $newBlockId = $destId;
  138. }
  139. else{
  140. $newBlockId = UUID::V4();
  141. }
  142. $arrBlockTransform[$fBlock[0]["id"]] = $newBlockId;
  143. if (count($fBlock) > 0) {
  144. array_push($arrNewBlock,
  145. array($newBlockId,
  146. "",
  147. $_GET["dest_channel"],
  148. $_GET["src_channel"],
  149. $_COOKIE["userid"],
  150. $fBlock[0]["book"],
  151. $fBlock[0]["paragraph"],
  152. $fBlock[0]["style"],
  153. $fBlock[0]["lang"],
  154. $fBlock[0]["status"],
  155. mTime(),
  156. mTime(),
  157. mTime()
  158. ));
  159. }
  160. $query = "SELECT * from "._TABLE_USER_WBW_." where block_id= ? ";
  161. $stmtWBW = $dbhWBW->prepare($query);
  162. $stmtWBW->execute(array($fBlock[0]["id"]));
  163. $fBlockData = $stmtWBW->fetchAll(PDO::FETCH_ASSOC);
  164. foreach ($fBlockData as $value) {
  165. array_push($arrNewBlockData,
  166. array(UUID::V4(),
  167. $arrBlockTransform[$value["block_id"]],
  168. $value["book"],
  169. $value["paragraph"],
  170. $value["wid"],
  171. $value["word"],
  172. $value["data"],
  173. mTime(),
  174. mTime(),
  175. $value["status"],
  176. $_COOKIE["userid"],
  177. ));
  178. }
  179. }
  180. # 查找目标block是否存在
  181. //删除旧的逐词解析block数据块
  182. $query = "DELETE from "._TABLE_USER_WBW_BLOCK_." where paragraph = ? AND book = ? AND channal = ? ";
  183. $stmt = $dbhWBW->prepare($query);
  184. $stmt->execute(array($iPara,$_GET["book"],$_GET["dest_channel"]));
  185. //新增逐词解析block数据块
  186. if (count($arrNewBlock) > 0) {
  187. $dbhWBW->beginTransaction();
  188. $query = "INSERT INTO "._TABLE_USER_WBW_BLOCK_." ('id','parent_id','channal','parent_channel','owner','book','paragraph','style','lang','status','modify_time','receive_time','create_time') VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)";
  189. $stmtNewBlock = $dbhWBW->prepare($query);
  190. foreach ($arrNewBlock as $oneParam) {
  191. $stmtNewBlock->execute($oneParam);
  192. }
  193. // 提交更改
  194. $dbhWBW->commit();
  195. if (!$stmtNewBlock || ($stmtNewBlock && $stmtNewBlock->errorCode() != 0)) {
  196. $error = $dbhWBW->errorInfo();
  197. echo "error - $error[2] <br>";
  198. exit;
  199. } else {
  200. //逐词解析block块复刻成功
  201. $count = count($arrNewBlock);
  202. echo "wbw block $count recorders.<br/>";
  203. }
  204. }
  205. //删除逐词解析数据块
  206. if(isset($destId)){
  207. $query = "DELETE from "._TABLE_USER_WBW_." where block_id = ? ";
  208. $stmt = $dbhWBW->prepare($query);
  209. $stmt->execute($destId);
  210. }
  211. if (count($arrNewBlockData) > 0) {
  212. // 开始一个事务,逐词解析数据 关闭自动提交
  213. $dbhWBW->beginTransaction();
  214. $query = "INSERT INTO "._TABLE_USER_WBW_." ('id','block_id','book','paragraph','wid','word','data','modify_time','receive_time','status','owner') VALUES (?,?,?,?,?,?,?,?,?,?,?)";
  215. $stmtWbwData = $dbhWBW->prepare($query);
  216. foreach ($arrNewBlockData as $oneParam) {
  217. $stmtWbwData->execute($oneParam);
  218. }
  219. // 提交更改
  220. $dbhWBW->commit();
  221. if (!$stmtWbwData || ($stmtWbwData && $stmtWbwData->errorCode() != 0)) {
  222. $error = $dbhWBW->errorInfo();
  223. echo "error - $error[2] <br>";
  224. exit;
  225. } else {
  226. //逐词解析 数据 复刻成功
  227. $count = count($arrNewBlockData);
  228. echo "new wbw $count recorders.";
  229. }
  230. }
  231. {
  232. //成功
  233. echo "doc list updata 1 recorders.";
  234. echo "</div>";
  235. echo "<h3>复刻成功</h3>";
  236. echo "正在<a href='../studio/editor.php?op=openchannal&book={$_GET["book"]}&para={$_para[0]}&channal={$_GET["dest_channel"]}'>打开</a>文档";
  237. echo "<script>";
  238. echo "window.location.assign(\"../studio/editor.php?op=openchannal&book={$_GET["book"]}&para={$_para[0]}&channal={$_GET["dest_channel"]}\");";
  239. echo "</script>";
  240. }
  241. }
  242. }
  243. }
  244. }
  245. }
  246. echo "</div>";
  247. ?>
  248. </body>
  249. </html>