index.html 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>身体档案管理</title>
  6. <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  7. <link rel="stylesheet" href="/assets/css/layui.css">
  8. <link rel="stylesheet" href="/assets/css/admin.css">
  9. </head>
  10. <body>
  11. <div class="layui-fluid">
  12. <div class="layui-card">
  13. <div class="layui-card-header">
  14. <h3>身体档案管理</h3>
  15. </div>
  16. <div class="layui-card-body">
  17. <!-- 搜索条件 -->
  18. <div class="layui-form layui-form-pane" lay-filter="search-form">
  19. <div class="layui-form-item">
  20. <div class="layui-inline">
  21. <label class="layui-form-label">关键词</label>
  22. <div class="layui-input-inline">
  23. <input type="text" name="search" placeholder="档案名称/关系" autocomplete="off" class="layui-input">
  24. </div>
  25. </div>
  26. <div class="layui-inline">
  27. <label class="layui-form-label">性别</label>
  28. <div class="layui-input-inline">
  29. <select name="gender">
  30. <option value="">全部</option>
  31. <option value="1">男</option>
  32. <option value="2">女</option>
  33. </select>
  34. </div>
  35. </div>
  36. <div class="layui-inline">
  37. <label class="layui-form-label">档案类型</label>
  38. <div class="layui-input-inline">
  39. <select name="is_own">
  40. <option value="">全部</option>
  41. <option value="1">本人档案</option>
  42. <option value="0">他人档案</option>
  43. </select>
  44. </div>
  45. </div>
  46. <div class="layui-inline">
  47. <button class="layui-btn" lay-submit lay-filter="search-btn">
  48. <i class="layui-icon layui-icon-search"></i> 搜索
  49. </button>
  50. <button type="reset" class="layui-btn layui-btn-primary">重置</button>
  51. </div>
  52. </div>
  53. </div>
  54. <!-- 工具栏 -->
  55. <div class="layui-row layui-col-space15">
  56. <div class="layui-col-md12">
  57. <div class="layui-btn-group">
  58. <button class="layui-btn" onclick="addProfile()">
  59. <i class="layui-icon layui-icon-add-1"></i> 新增档案
  60. </button>
  61. <button class="layui-btn layui-btn-danger" onclick="batchDelete()">
  62. <i class="layui-icon layui-icon-delete"></i> 批量删除
  63. </button>
  64. <button class="layui-btn layui-btn-normal" onclick="exportData()">
  65. <i class="layui-icon layui-icon-export"></i> 导出数据
  66. </button>
  67. <button class="layui-btn layui-btn-warm" onclick="showStatistics()">
  68. <i class="layui-icon layui-icon-chart"></i> 统计分析
  69. </button>
  70. </div>
  71. </div>
  72. </div>
  73. <!-- 数据表格 -->
  74. <table class="layui-hide" id="profileTable" lay-filter="profileTable"></table>
  75. </div>
  76. </div>
  77. </div>
  78. <!-- 操作按钮模板 -->
  79. <script type="text/html" id="operateBar">
  80. <div class="layui-btn-group">
  81. <a class="layui-btn layui-btn-xs" lay-event="detail">
  82. <i class="layui-icon layui-icon-list"></i> 详情
  83. </a>
  84. <a class="layui-btn layui-btn-xs layui-btn-normal" lay-event="measurements">
  85. <i class="layui-icon layui-icon-form"></i> 测量数据
  86. </a>
  87. <a class="layui-btn layui-btn-xs layui-btn-warm" lay-event="bodyTypes">
  88. <i class="layui-icon layui-icon-template-1"></i> 体型选择
  89. </a>
  90. <a class="layui-btn layui-btn-xs layui-btn-hot" lay-event="generateReport">
  91. <i class="layui-icon layui-icon-file"></i> 生成报告
  92. </a>
  93. <a class="layui-btn layui-btn-xs" lay-event="edit">
  94. <i class="layui-icon layui-icon-edit"></i> 编辑
  95. </a>
  96. <a class="layui-btn layui-btn-xs layui-btn-danger" lay-event="delete">
  97. <i class="layui-icon layui-icon-delete"></i> 删除
  98. </a>
  99. </div>
  100. </script>
  101. <!-- 性别模板 -->
  102. <script type="text/html" id="genderTpl">
  103. {{# if(d.gender == 1) { }}
  104. <span class="layui-badge layui-bg-blue">男</span>
  105. {{# } else if(d.gender == 2) { }}
  106. <span class="layui-badge layui-bg-red">女</span>
  107. {{# } else { }}
  108. <span class="layui-badge">未知</span>
  109. {{# } }}
  110. </script>
  111. <!-- 档案类型模板 -->
  112. <script type="text/html" id="isOwnTpl">
  113. {{# if(d.is_own == 1) { }}
  114. <span class="layui-badge layui-bg-green">本人档案</span>
  115. {{# } else { }}
  116. <span class="layui-badge layui-bg-orange">他人档案</span>
  117. {{# } }}
  118. </script>
  119. <!-- BMI模板 -->
  120. <script type="text/html" id="bmiTpl">
  121. {{# if(d.bmi > 0) { }}
  122. <span class="layui-badge
  123. {{# if(d.bmi_level == '偏瘦') { }}layui-bg-cyan
  124. {{# } else if(d.bmi_level == '正常') { }}layui-bg-green
  125. {{# } else if(d.bmi_level == '超重') { }}layui-bg-orange
  126. {{# } else { }}layui-bg-red{{# } }}">
  127. {{d.bmi}} ({{d.bmi_level}})
  128. </span>
  129. {{# } else { }}
  130. <span class="layui-badge">未测量</span>
  131. {{# } }}
  132. </script>
  133. <script src="/assets/js/layui.js"></script>
  134. <script>
  135. layui.use(['table', 'form', 'layer'], function(){
  136. var table = layui.table;
  137. var form = layui.form;
  138. var layer = layui.layer;
  139. // 渲染表格
  140. table.render({
  141. elem: '#profileTable',
  142. url: '{:url("index")}',
  143. toolbar: false,
  144. defaultToolbar: ['filter', 'exports', 'print'],
  145. cols: [[
  146. {type: 'checkbox', fixed: 'left'},
  147. {field: 'id', title: 'ID', width: 80, sort: true},
  148. {field: 'profile_name', title: '档案名称', width: 120},
  149. {field: 'user.username', title: '用户', width: 100},
  150. {field: 'gender', title: '性别', width: 80, templet: '#genderTpl'},
  151. {field: 'is_own', title: '类型', width: 100, templet: '#isOwnTpl'},
  152. {field: 'relation', title: '关系', width: 100},
  153. {field: 'age', title: '年龄', width: 80},
  154. {field: 'height', title: '身高(cm)', width: 100},
  155. {field: 'weight', title: '体重(kg)', width: 100},
  156. {field: 'bmi', title: 'BMI', width: 120, templet: '#bmiTpl'},
  157. {field: 'createtime', title: '创建时间', width: 160, templet: function(d){
  158. return layui.util.toDateString(d.createtime * 1000, 'yyyy-MM-dd HH:mm');
  159. }},
  160. {title: '操作', width: 350, align: 'center', fixed: 'right', toolbar: '#operateBar'}
  161. ]],
  162. page: true,
  163. limit: 15,
  164. limits: [15, 30, 50, 100],
  165. loading: true,
  166. text: {
  167. none: '暂无相关数据'
  168. }
  169. });
  170. // 监听搜索
  171. form.on('submit(search-btn)', function(data){
  172. table.reload('profileTable', {
  173. where: data.field,
  174. page: {curr: 1}
  175. });
  176. return false;
  177. });
  178. // 监听工具栏事件
  179. table.on('tool(profileTable)', function(obj){
  180. var data = obj.data;
  181. var layEvent = obj.event;
  182. switch(layEvent) {
  183. case 'detail':
  184. viewDetail(data.id);
  185. break;
  186. case 'measurements':
  187. manageMeasurements(data.id);
  188. break;
  189. case 'bodyTypes':
  190. manageBodyTypes(data.id);
  191. break;
  192. case 'generateReport':
  193. generateReport(data.id);
  194. break;
  195. case 'edit':
  196. editProfile(data.id);
  197. break;
  198. case 'delete':
  199. deleteProfile(data.id);
  200. break;
  201. }
  202. });
  203. // 监听行双击
  204. table.on('rowDouble(profileTable)', function(obj){
  205. viewDetail(obj.data.id);
  206. });
  207. });
  208. // 新增档案
  209. function addProfile() {
  210. layer.open({
  211. type: 2,
  212. title: '新增档案',
  213. area: ['800px', '600px'],
  214. content: '{:url("add")}',
  215. end: function() {
  216. layui.table.reload('profileTable');
  217. }
  218. });
  219. }
  220. // 查看详情
  221. function viewDetail(id) {
  222. layer.open({
  223. type: 2,
  224. title: '档案详情',
  225. area: ['1000px', '700px'],
  226. content: '{:url("detail")}?ids=' + id
  227. });
  228. }
  229. // 编辑档案
  230. function editProfile(id) {
  231. layer.open({
  232. type: 2,
  233. title: '编辑档案',
  234. area: ['800px', '600px'],
  235. content: '{:url("edit")}?ids=' + id,
  236. end: function() {
  237. layui.table.reload('profileTable');
  238. }
  239. });
  240. }
  241. // 删除档案
  242. function deleteProfile(id) {
  243. layer.confirm('确定要删除这个档案吗?删除后无法恢复!', {
  244. icon: 3,
  245. title: '提示'
  246. }, function(index) {
  247. layui.$.post('{:url("del")}', {ids: id}, function(res) {
  248. if (res.code === 1) {
  249. layer.msg('删除成功');
  250. layui.table.reload('profileTable');
  251. } else {
  252. layer.msg(res.msg);
  253. }
  254. });
  255. layer.close(index);
  256. });
  257. }
  258. // 管理测量数据
  259. function manageMeasurements(id) {
  260. layer.open({
  261. type: 2,
  262. title: '测量数据管理',
  263. area: ['1000px', '700px'],
  264. content: '{:url("measurements")}?profile_id=' + id
  265. });
  266. }
  267. // 管理体型选择
  268. function manageBodyTypes(id) {
  269. layer.open({
  270. type: 2,
  271. title: '体型选择管理',
  272. area: ['900px', '600px'],
  273. content: '{:url("bodyTypes")}?profile_id=' + id
  274. });
  275. }
  276. // 生成AI报告
  277. function generateReport(id) {
  278. layer.confirm('确定要生成AI分析报告吗?', {
  279. icon: 3,
  280. title: '提示'
  281. }, function(index) {
  282. var loading = layer.load(2, {content: '正在生成报告...'});
  283. layui.$.post('{:url("generateReport")}', {profile_id: id}, function(res) {
  284. layer.close(loading);
  285. if (res.code === 1) {
  286. layer.msg('报告生成成功');
  287. // 打开报告页面
  288. layer.open({
  289. type: 2,
  290. title: 'AI分析报告',
  291. area: ['1000px', '700px'],
  292. content: '{:url("viewReport")}?report_id=' + res.data.report_id
  293. });
  294. } else {
  295. layer.msg(res.msg);
  296. }
  297. });
  298. layer.close(index);
  299. });
  300. }
  301. // 批量删除
  302. function batchDelete() {
  303. var checkStatus = layui.table.checkStatus('profileTable');
  304. var data = checkStatus.data;
  305. if (data.length === 0) {
  306. layer.msg('请先选择要删除的档案');
  307. return;
  308. }
  309. var ids = data.map(function(item) {
  310. return item.id;
  311. }).join(',');
  312. layer.confirm('确定要删除选中的 ' + data.length + ' 个档案吗?', {
  313. icon: 3,
  314. title: '批量删除确认'
  315. }, function(index) {
  316. layui.$.post('{:url("del")}', {ids: ids}, function(res) {
  317. if (res.code === 1) {
  318. layer.msg('删除成功');
  319. layui.table.reload('profileTable');
  320. } else {
  321. layer.msg(res.msg);
  322. }
  323. });
  324. layer.close(index);
  325. });
  326. }
  327. // 导出数据
  328. function exportData() {
  329. layer.msg('导出功能开发中...');
  330. }
  331. // 显示统计
  332. function showStatistics() {
  333. layer.open({
  334. type: 2,
  335. title: '统计分析',
  336. area: ['1000px', '700px'],
  337. content: '{:url("statistics")}'
  338. });
  339. }
  340. </script>
  341. </body>
  342. </html>