在本教程中,您将学习如何创建或开发PHP CRUD操作使用Ajax和DataTablesW/OPagre刷新/再装。在这里,我们将使用DataTables。本教程特别有助于优化您未来的页面加载。

我们将要创建的简单Web应用程序的主要目标是使用DataTables将数据库中的数据/记录显示到表中,这意味着它具有排序、筛选、限制和分页功能。我们会用Ajax若要处理新的、更新的和删除的数据,请执行以下操作。最后,在每个进程中,表必须更新其数据而不留下当前页/重新加载/刷新。

开始

在本教程中,我将使用以下内容

将插件/库文件编译在XAMPP的htdocs目录。请打开你的XAMPP控制面板并启动ApacheMySQL.

创建数据库

在web浏览器中,浏览PHPMyAdminE.http://localhost/phpmyadmin并创建一个新的数据库命名dummy_db.。然后导航到数据库。SQLTabpaster这个SQL脚本下面创建我们的数据库表和列。

  1. CREATE TABLE `authors` (
  2. `id` int(11) NOT NULL,
  3. `first_name` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  4. `last_name` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  5. `email` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  6. `birthdate` date NOT NULL,
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
  8. ALTER TABLE `authors`
  9. ALTER TABLE `authors`

创建数据库连接

在源代码文件夹中,创建一个新的PHP文件命名Connect.php复制/粘贴下面的剧本。脚本将创建到我们数据库的连接。

  1. <?php
  2. $host = “localhost”;
  3. $username = “root”;
  4. $password = “”;
  5. $database = “dummy_db”;
  6. $conn = new mysqli($host, $username, $password, $database);
  7. if(!$conn){
  8. echo “Database connection failed. Error:”.$conn->error;
  9. }
  10. ?>

创建接口

创建一个新的PHP文件命名Index.php。粘贴以下脚本,以创建我们的Web应用程序的界面。请确保插件/库路径都是正确的。CSS链接外部JavaScript.

  1. <!DOCTYPE html>
  2. <html lang=“en”>
  3. <meta charset=“UTF-8”>
  4. <meta http-equiv=“X-UA-Compatible” content=“IE=edge”>
  5. <meta name=“viewport” content=“width=device-width, initial-scale=1.0”>
  6. <title>PHP CRUD using Ajax and DataTables</title>
  7. <link rel=“stylesheet” href=“css/bootstrap.css”>
  8. <link rel=“stylesheet” href=“DataTables/datatables.min.css”>
  9. <link rel=“stylesheet” href=“https://cdn.datatables.net/buttons/2.0.0/css/buttons.dataTables.min.css”>
  10. <script src=“js/jquery-3.6.0.min.js”></script>
  11. <script src=“js/bootstrap.js”></script>
  12. <script src=“DataTables/datatables.min.js”></script>
  13. <script src=“https://cdn.datatables.net/buttons/2.0.0/js/dataTables.buttons.min.js”></script>
  14. <script src=“js/script.js”></script>
  15. button.dt-button.btn-primary{
  16. background:var(–bs-primary)!important;
  17. color:white;
  18. }
  19. </head>
  20. <body class=“”>
  21. <nav class=“navbar navbar-expand-lg navbar-light bg-dark bg-gradient”>
  22. <div class=“container”>
  23. <a class=“navbar-brand text-light text-shadow” href=“//www.sourcecodester” target=“_blank”>SourceCodester</a>
  24. </div>
  25. </nav>
  26. <div class=“container py-5 h-100”>
  27. <div class=“row”>
  28. <div class=“col-lg-12”>
  29. <h3 class=“text-center”><b>PHP CRUD w/o Refresh using Ajax and DataTable</b></h3>
  30. </div>
  31. </div>
  32. <hr>
  33. <div class=“row”>
  34. <div class=“col-md-12” id=“msg”></div>
  35. </div>
  36. <div class=“row”>
  37. <div class=“col-lg-12”>
  38. <table class=“table table-hover table-bordered table-striped” id=“authors-tbl”>
  39. <tr class=“bg-dark text-light bg-gradient bg-opacity-150”>
  40. <th class=“px-1 py-1 text-center”>#</th>
  41. <th class=“px-1 py-1 text-center”>First Name</th>
  42. <th class=“px-1 py-1 text-center”>Last Name</th>
  43. <th class=“px-1 py-1 text-center”>Email</th>
  44. <th class=“px-1 py-1 text-center”>Birth Date</th>
  45. <th class=“px-1 py-1 text-center”>Action</th>
  46. </tr>
  47. <tr class=“bg-dark text-light bg-gradient bg-opacity-150”>
  48. <th class=“px-1 py-1 text-center”>#</th>
  49. <th class=“px-1 py-1 text-center”>First Name</th>
  50. <th class=“px-1 py-1 text-center”>Last Name</th>
  51. <th class=“px-1 py-1 text-center”>Email</th>
  52. <th class=“px-1 py-1 text-center”>Birth Date</th>
  53. <th class=“px-1 py-1 text-center”>Action</th>
  54. </tr>
  55. </div>
  56. </div>
  57. </div>
  58. <!– Add Modal –>
  59. <div class=“modal fade” id=“add_modal” data-bs-backdrop=“static”>
  60. <div class=“modal-dialog”>
  61. <div class=“modal-content”>
  62. <div class=“modal-header”>
  63. <h5 class=“modal-title”>Add Author</h5>
  64. <button type=“button” class=“btn-close” data-bs-dismiss=“modal” aria-label=“Close”></button>
  65. </div>
  66. <div class=“modal-body”>
  67. <div class=“container-fluid”>
  68. <form action=“” id=“new-author-frm”>
  69. <div class=“form-group”>
  70. <label for=“first_name” class=“control-label”>First Name</label>
  71. <input type=“text” class=“form-control rounded-0” id=“first_name” name=“first_name” required>
  72. </div>
  73. <div class=“form-group”>
  74. <label for=“last_name” class=“control-label”>Last Name</label>
  75. <input type=“text” class=“form-control rounded-0” id=“last_name” name=“last_name” required>
  76. </div>
  77. <div class=“form-group”>
  78. <label for=“email” class=“control-label”>Email</label>
  79. <input type=“text” class=“form-control rounded-0” id=“email” name=“email” required>
  80. </div>
  81. <div class=“form-group”>
  82. <label for=“birthdate” class=“control-label”>Date of Birth</label>
  83. <input type=“date” class=“form-control rounded-0” id=“birthdate” name=“birthdate” required>
  84. </div>
  85. </form>
  86. </div>
  87. </div>
  88. <div class=“modal-footer”>
  89. <button type=“submit” class=“btn btn-primary” form=“new-author-frm”>Save</button>
  90. <button type=“button” class=“btn btn-secondary” data-bs-dismiss=“modal”>Close</button>
  91. </div>
  92. </div>
  93. </div>
  94. </div>
  95. <!– /Add Modal –>
  96. <!– Edit Modal –>
  97. <div class=“modal fade” id=“edit_modal” data-bs-backdrop=“static”>
  98. <div class=“modal-dialog”>
  99. <div class=“modal-content”>
  100. <div class=“modal-header”>
  101. <h5 class=“modal-title”>Edit Author’s Details</h5>
  102. <button type=“button” class=“btn-close” data-bs-dismiss=“modal” aria-label=“Close”></button>
  103. </div>
  104. <div class=“modal-body”>
  105. <div class=“container-fluid”>
  106. <form action=“” id=“edit-author-frm”>
  107. <input type=“hidden” name=“id”>
  108. <div class=“form-group”>
  109. <label for=“first_name” class=“control-label”>First Name</label>
  110. <input type=“text” class=“form-control rounded-0” id=“first_name” name=“first_name” required>
  111. </div>
  112. <div class=“form-group”>
  113. <label for=“last_name” class=“control-label”>Last Name</label>
  114. <input type=“text” class=“form-control rounded-0” id=“last_name” name=“last_name” required>
  115. </div>
  116. <div class=“form-group”>
  117. <label for=“email” class=“control-label”>Email</label>
  118. <input type=“text” class=“form-control rounded-0” id=“email” name=“email” required>
  119. </div>
  120. <div class=“form-group”>
  121. <label for=“birthdate” class=“control-label”>Date of Birth</label>
  122. <input type=“date” class=“form-control rounded-0” id=“birthdate” name=“birthdate” required>
  123. </div>
  124. </form>
  125. </div>
  126. </div>
  127. <div class=“modal-footer”>
  128. <button type=“submit” class=“btn btn-primary” form=“edit-author-frm”>Save</button>
  129. <button type=“button” class=“btn btn-secondary” data-bs-dismiss=“modal”>Close</button>
  130. </div>
  131. </div>
  132. </div>
  133. </div>
  134. <!– /Edit Modal –>
  135. <!– Delete Modal –>
  136. <div class=“modal fade” id=“delete_modal” data-bs-backdrop=“static”>
  137. <div class=“modal-dialog modal-dialog-centered”>
  138. <div class=“modal-content”>
  139. <div class=“modal-header”>
  140. <h5 class=“modal-title”>Confirm</h5>
  141. </div>
  142. <div class=“modal-body”>
  143. <div class=“container-fluid”>
  144. <form action=“” id=“delete-author-frm”>
  145. <input type=“hidden” name=“id”>
  146. <p>Are you sure to delete <b><span id=“name”></span></b> from the list?</p>
  147. </form>
  148. </div>
  149. </div>
  150. <div class=“modal-footer”>
  151. <button type=“submit” class=“btn btn-danger” form=“delete-author-frm”>Yes</button>
  152. <button type=“button” class=“btn btn-primary” data-bs-dismiss=“modal”>No</button>
  153. </div>
  154. </div>
  155. </div>
  156. </div>
  157. <!– /Delete Modal –>
  158. </body>
  159. </html>

创建JavaScript函数

下面的脚本包含启动CRUD操作进程的所有脚本和函数。它还包括DataTables印心。将文件保存为Script.js。在我的例子中,文件位于JS目录在我的源代码文件夹中。

  1. var authorsTbl = ;
  2. $(function() {
  3. // draw function [called if the database updates]
  4. function draw_data() {
  5. if ($.fn.dataTable.isDataTable(‘#authors-tbl’) && authorsTbl != ) {
  6. authorsTbl.draw(true)
  7. } else {
  8. load_data();
  9. }
  10. }
  11. function load_data() {
  12. authorsTbl = $(‘#authors-tbl’).DataTable({
  13. dom: ‘<“row”B>flr<“py-2 my-2″t>ip’,
  14. “processing”: true,
  15. “serverSide”: true,
  16. “ajax”: {
  17. url: “./get_authors.php”,
  18. method: ‘POST’
  19. },
  20. columns: [{
  21. data: ‘id’,
  22. className: ‘py-0 px-1’
  23. },
  24. {
  25. data: ‘first_name’,
  26. className: ‘py-0 px-1’
  27. },
  28. {
  29. data: ‘last_name’,
  30. className: ‘py-0 px-1’
  31. },
  32. {
  33. data: ’email’,
  34. className: ‘py-0 px-1’
  35. },
  36. {
  37. data: ‘birthdate’,
  38. className: ‘py-0 px-1’
  39. },
  40. {
  41. data: null,
  42. orderable: false,
  43. className: ‘text-center py-0 px-1’,
  44. render: function(data, type, row, meta) {
  45. console.log()
  46. return ‘<a class=”me-2 btn btn-sm rounded-0 py-0 edit_data btn-primary” href=”javascript:void(0)” data-id=”‘ + (row.id) + ‘”>Edit</a><a class=”btn btn-sm rounded-0 py-0 delete_data btn-danger” href=”javascript:void(0)” data-id=”‘ + (row.id) + ‘”>Delete</a>’;
  47. }
  48. }
  49. ],
  50. drawCallback: function(settings) {
  51. $(‘.edit_data’).click(function() {
  52. $.ajax({
  53. url: ‘get_single.php’,
  54. data: { id: $(this).attr(‘data-id’) },
  55. method: ‘POST’,
  56. dataType: ‘json’,
  57. error: err => {
  58. alert(“An error occured while fetching single data”)
  59. },
  60. success: function(resp) {
  61. if (!!resp.status) {
  62. Object.keys(resp.data).map(k => {
  63. if ($(‘#edit_modal’).find(‘input[name=”‘ + k + ‘”]’).length > 0)
  64. $(‘#edit_modal’).find(‘input[name=”‘ + k + ‘”]’).val(resp.data[k])
  65. })
  66. $(‘#edit_modal’).modal(‘show’)
  67. } else {
  68. alert(“An error occured while fetching single data”)
  69. }
  70. }
  71. })
  72. })
  73. $(‘.delete_data’).click(function() {
  74. $.ajax({
  75. url: ‘get_single.php’,
  76. data: { id: $(this).attr(‘data-id’) },
  77. method: ‘POST’,
  78. dataType: ‘json’,
  79. error: err => {
  80. alert(“An error occured while fetching single data”)
  81. },
  82. success: function(resp) {
  83. if (!!resp.status) {
  84. $(‘#delete_modal’).find(‘input[name=”id”]’).val(resp.data[‘id’])
  85. $(‘#delete_modal’).modal(‘show’)
  86. } else {
  87. alert(“An error occured while fetching single data”)
  88. }
  89. }
  90. })
  91. })
  92. },
  93. buttons: [{
  94. text: “Add New”,
  95. className: “btn btn-primary py-0”,
  96. action: function(e, dt, node, config) {
  97. $(‘#add_modal’).modal(‘show’)
  98. }
  99. }],
  100. “order”: [
  101. [1, “asc”]
  102. ],
  103. initComplete: function(settings) {
  104. $(‘.paginate_button’).addClass(‘p-1’)
  105. }
  106. });
  107. }
  108. //Load Data
  109. load_data()
  110. //Saving new Data
  111. $(‘#new-author-frm’).submit(function(e) {
  112. e.preventDefault()
  113. $(‘#add_modal button’).attr(‘disabled’, true)
  114. $(‘#add_modal button[form=”new-author-frm”]’).text(“saving …”)
  115. $.ajax({
  116. url: ‘save_data.php’,
  117. data: $(this).serialize(),
  118. method: ‘POST’,
  119. dataType: “json”,
  120. error: err => {
  121. alert(“An error occured. Please chech the source code and try again”)
  122. },
  123. success: function(resp) {
  124. if (!!resp.status) {
  125. if (resp.status == ‘success’) {
  126. var _el = $(‘<div>’)
  127. _el.hide()
  128. _el.addClass(‘alert alert-primary alert_msg’)
  129. _el.text(“Data successfulle saved”);
  130. $(‘#new-author-frm’).get(0).reset()
  131. $(‘.modal’).modal(‘hide’)
  132. $(‘#msg’).append(_el)
  133. _el.show(‘slow’)
  134. draw_data();
  135. setTimeout(() => {
  136. _el.hide(‘slow’)
  137. .remove()
  138. }, 2500)
  139. } else if (resp.status == ‘success’ && !!resp.msg) {
  140. var _el = $(‘<div>’)
  141. _el.hide()
  142. _el.addClass(‘alert alert-danger alert_msg form-group’)
  143. _el.text(resp.msg);
  144. $(‘#new-author-frm’).append(_el)
  145. _el.show(‘slow’)
  146. } else {
  147. alert(“An error occured. Please chech the source code and try again”)
  148. }
  149. } else {
  150. alert(“An error occurred. Please check the source code and try again”)
  151. }
  152. $(‘#add_modal button’).attr(‘disabled’, false)
  153. $(‘#add_modal button[form=”new-author-frm”]’).text(“Save”)
  154. }
  155. })
  156. })
  157. // Update Data
  158. $(‘#edit-author-frm’).submit(function(e) {
  159. e.preventDefault()
  160. $(‘#edit_modal button’).attr(‘disabled’, true)
  161. $(‘#edit_modal button[form=”edit-author-frm”]’).text(“saving …”)
  162. $.ajax({
  163. url: ‘update_data.php’,
  164. data: $(this).serialize(),
  165. method: ‘POST’,
  166. dataType: “json”,
  167. error: err => {
  168. alert(“An error occured. Please chech the source code and try again”)
  169. },
  170. success: function(resp) {
  171. if (!!resp.status) {
  172. if (resp.status == ‘success’) {
  173. var _el = $(‘<div>’)
  174. _el.hide()
  175. _el.addClass(‘alert alert-primary alert_msg’)
  176. _el.text(“Data successfulle updated”);
  177. $(‘#edit-author-frm’).get(0).reset()
  178. $(‘.modal’).modal(‘hide’)
  179. $(‘#msg’).append(_el)
  180. _el.show(‘slow’)
  181. draw_data();
  182. setTimeout(() => {
  183. _el.hide(‘slow’)
  184. .remove()
  185. }, 2500)
  186. } else if (resp.status == ‘success’ && !!resp.msg) {
  187. var _el = $(‘<div>’)
  188. _el.hide()
  189. _el.addClass(‘alert alert-danger alert_msg form-group’)
  190. _el.text(resp.msg);
  191. $(‘#edit-author-frm’).append(_el)
  192. _el.show(‘slow’)
  193. } else {
  194. alert(“An error occured. Please chech the source code and try again”)
  195. }
  196. } else {
  197. alert(“An error occurred. Please check the source code and try again”)
  198. }
  199. $(‘#edit_modal button’).attr(‘disabled’, false)
  200. $(‘#edit_modal button[form=”edit-author-frm”]’).text(“Save”)
  201. }
  202. })
  203. })
  204. // DELETE Data
  205. $(‘#delete-author-frm’).submit(function(e) {
  206. e.preventDefault()
  207. $(‘#delete_modal button’).attr(‘disabled’, true)
  208. $(‘#delete_modal button[form=”delete-author-frm”]’).text(“deleting data …”)
  209. $.ajax({
  210. url: ‘delete_data.php’,
  211. data: $(this).serialize(),
  212. method: ‘POST’,
  213. dataType: “json”,
  214. error: err => {
  215. alert(“An error occured. Please chech the source code and try again”)
  216. },
  217. success: function(resp) {
  218. if (!!resp.status) {
  219. if (resp.status == ‘success’) {
  220. var _el = $(‘<div>’)
  221. _el.hide()
  222. _el.addClass(‘alert alert-primary alert_msg’)
  223. _el.text(“Data successfulle updated”);
  224. $(‘#delete-author-frm’).get(0).reset()
  225. $(‘.modal’).modal(‘hide’)
  226. $(‘#msg’).append(_el)
  227. _el.show(‘slow’)
  228. draw_data();
  229. setTimeout(() => {
  230. _el.hide(‘slow’)
  231. .remove()
  232. }, 2500)
  233. } else if (resp.status == ‘success’ && !!resp.msg) {
  234. var _el = $(‘<div>’)
  235. _el.hide()
  236. _el.addClass(‘alert alert-danger alert_msg form-group’)
  237. _el.text(resp.msg);
  238. $(‘#delete-author-frm’).append(_el)
  239. _el.show(‘slow’)
  240. } else {
  241. alert(“An error occured. Please chech the source code and try again”)
  242. }
  243. } else {
  244. alert(“An error occurred. Please check the source code and try again”)
  245. }
  246. $(‘#delete_modal button’).attr(‘disabled’, false)
  247. $(‘#delete_modal button[form=”delete-author-frm”]’).text(“YEs”)
  248. }
  249. })
  250. })
  251. });

创建我们的PHPAPI

以下内容PHP文件是我们数据库中查询的代码。它们用于获取、添加和删除OUE数据库中的数据。将文件保存为每个脚本上方的文件名。

Get_Auths.php

  1. <?php
  2. require_once(“./connect.php”);
  3. extract($_POST);
  4. $totalCount = $conn->query(“SELECT * FROM `authors` “)->num_rows;
  5. $search_where = “”;
  6. if(!empty($search)){
  7. $search_where = ” where “;
  8. $search_where .= ” first_name LIKE ‘%{$search[‘value’]}%’ “;
  9. $search_where .= ” OR last_name LIKE ‘%{$search[‘value’]}%’ “;
  10. $search_where .= ” OR email LIKE ‘%{$search[‘value’]}%’ “;
  11. $search_where .= ” OR date_format(birthdate,’%M %d, %Y’) LIKE ‘%{$search[‘value’]}%’ “;
  12. }
  13. $columns_arr = array(“id”,
  14. “first_name”,
  15. “last_name”,
  16. “email”,
  17. “unix_timestamp(birthdate)”);
  18. $query = $conn->query(“SELECT * FROM `authors` {$search_where} ORDER BY {$columns_arr[$order[0][‘column’]]} {$order[0][‘dir’]} limit {$length} offset {$start});
  19. $recordsFilterCount = $conn->query(“SELECT * FROM `authors` {$search_where})->num_rows;
  20. $recordsTotal= $totalCount;
  21. $recordsFiltered= $recordsFilterCount;
  22. $data = array();
  23. $i= 1 + $start;
  24. while($row = $query->fetch_assoc()){
  25. $row[‘no’] = $i++;
  26. $row[‘birthdate’] = date(“F d, Y”,strtotime($row[‘birthdate’]));
  27. $data[] = $row;
  28. }
  29. echo json_encode(array(‘draw’=>$draw,
  30. ‘recordsTotal’=>$recordsTotal,
  31. ‘recordsFiltered’=>$recordsFiltered,
  32. ‘data’=>$data
  33. )
  34. );

Save_data.php

  1. <?php
  2. require_once(‘connect.php’);
  3. extract($_POST);
  4. $query = $conn->query(“INSERT INTO `authors` (`first_name`,`last_name`,`email`,`birthdate`) VALUE (‘{$first_name}‘,’{$last_name}‘,’{$email}‘,’{$birthdate}‘)”);
  5. if($query){
  6. $resp[‘status’] = ‘success’;
  7. }else{
  8. $resp[‘status’] = ‘failed’;
  9. $resp[‘msg’] = ‘An error occured while saving the data. Error: ‘.$conn->error;
  10. }
  11. echo json_encode($resp);

Get_single.php

  1. <?php
  2. require_once(‘connect.php’);
  3. extract($_POST);
  4. $query = $conn->query(“SELECT * FROM `authors` where id = ‘{$id}‘”);
  5. if($query){
  6. $resp[‘status’] = ‘success’;
  7. $resp[‘data’] = $query->fetch_array();
  8. }else{
  9. $resp[‘status’] = ‘success’;
  10. $resp[‘error’] = ‘An error occured while fetching the data. Error: ‘.$conn->error;
  11. }
  12. echo json_encode($resp);

UPDATE_data.php

  1. <?php
  2. require_once(‘connect.php’);
  3. extract($_POST);
  4. $update = $conn->query(“UPDATE `authors` set `first_name` = ‘{$first_name}‘, `last_name` = ‘{$last_name}‘, `email` = ‘{$email}‘,`birthdate` = ‘{$birthdate}‘ where id = ‘{$id}‘”);
  5. if($update){
  6. $resp[‘status’] = ‘success’;
  7. }else{
  8. $resp[‘status’] = ‘failed’;
  9. $resp[‘msg’] = ‘An error occured while saving the data. Error: ‘.$conn->error;
  10. }
  11. echo json_encode($resp);

DELETE_data.php

  1. <?php
  2. require_once(‘connect.php’);
  3. extract($_POST);
  4. $delete = $conn->query(“DELETE FROM `authors` where id = ‘{$id}‘”);
  5. if($delete){
  6. $resp[‘status’] = ‘success’;
  7. }else{
  8. $resp[‘status’] = ‘failed’;
  9. $resp[‘msg’] = ‘An error occured while saving the data. Error: ‘.$conn->error;
  10. }
  11. echo json_encode($resp);

您现在可以测试我们在您的终端上创建的Web应用程序。如果有错误发生在你的一端。请查看上面的脚本。您还可以下载我创建的工作源代码。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。

最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。 若排除这种情况,可在对应资源底部留言,或联络我们。

对于会员专享、整站源码、程序插件、网站模板、网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。

如果您已经成功付款但是网站没有弹出成功提示,请联系站长提供付款信息为您处理

源码素材属于虚拟商品,具有可复制性,可传播性,一旦授予,不接受任何形式的退款、换货要求。请您在购买获取之前确认好 是您所需要的资源