1
0

control.js 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. import React, {PureComponent} from 'react';
  2. import ReactDOM from 'react-dom/client';
  3. import './control.css';
  4. import axios from "axios";
  5. export default class Control extends PureComponent {
  6. state = {
  7. temperature:0,
  8. pattern:1,
  9. windSpeed : 6,
  10. selectType : false,
  11. openVisible : false,
  12. // 运行状态数据
  13. data:null,
  14. }
  15. componentWillMount() {
  16. this.getData();
  17. this.interval = setInterval(() => this.getData(), 300000);
  18. }
  19. //组件销毁的时候清除定时器就行
  20. componentWillUnmount() {
  21. clearInterval(this.interval);
  22. }
  23. // 获取数据
  24. getData = () =>{
  25. axios.get("/api/v1/status").then(res => {
  26. const datas = res?.data;
  27. if(datas && datas.code === 0){
  28. this.setState({
  29. data : datas?.data || null ,
  30. temperature : datas?.data?.set_temp,
  31. openVisible : datas?.data?.power === 1,
  32. pattern:datas?.data?.mode,
  33. windSpeed: datas?.data?.fan_speed,
  34. })
  35. }
  36. }).catch(err => {
  37. this.toast(err.message,2000);
  38. })
  39. }
  40. // 提示框
  41. toast = (text, time) => {
  42. let toast = document.getElementById('toast');
  43. let toast_box = document.getElementsByClassName('toast_box')[0];
  44. toast.innerHTML = text;
  45. toast_box.style.animation = 'show 1.5s'
  46. toast_box.style.display = 'inline-block';
  47. setTimeout(function(){
  48. toast_box.style.animation = 'hide 1.5s'
  49. setTimeout(function(){
  50. toast_box.style.display = 'none';
  51. }, 1400)
  52. }, time)
  53. }
  54. // 增加温度
  55. add = () =>{
  56. const { temperature } = this.state;
  57. if(temperature < 30){
  58. axios.post("/api/v1/set_temp",{temp : temperature + 1}).then(res => {
  59. const data = res?.data;
  60. if(data && data.code === 0){
  61. this.setState({temperature : temperature + 1});
  62. }else {
  63. this.toast(data.message,2000);
  64. }
  65. }).catch(err => {
  66. this.toast(err.message,2000);
  67. })
  68. }else {
  69. this.toast('最高温度30度',2000);
  70. }
  71. }
  72. // 温度减
  73. down = () =>{
  74. const { temperature } = this.state;
  75. if(temperature > 16){
  76. axios.post("/api/v1/set_temp",{temp : temperature - 1}).then(res => {
  77. const data = res?.data;
  78. if(data && data.code === 0){
  79. this.setState({ temperature : temperature - 1})
  80. }else {
  81. this.toast(data.message,2000);
  82. }
  83. }).catch(err => {
  84. this.toast(err.message,2000);
  85. })
  86. }else {
  87. this.toast('最低温度16度',2000);
  88. }
  89. }
  90. // 选择模式
  91. patternSelect = item =>{
  92. axios.post("/api/v1/mode",{mode : item}).then(res => {
  93. const data = res?.data;
  94. if(data && data.code === 0){
  95. this.setState({ pattern : item});
  96. }
  97. }).catch(err => {
  98. this.toast(err.message,2000);
  99. })
  100. }
  101. // 选择风速
  102. speedSelect = item =>{
  103. axios.post("/api/v1/fan_speed",{speed : item}).then(res => {
  104. const data = res?.data;
  105. if(data && data.code === 0){
  106. this.setState({ windSpeed : item});
  107. }
  108. }).catch(err => {
  109. this.toast(err.message,2000);
  110. })
  111. }
  112. // 睡眠模式
  113. sleepSelect = () =>{
  114. const { selectType } = this.state;
  115. if(selectType){
  116. this.setState({ selectType : false});
  117. }else {
  118. this.setState({ selectType : true});
  119. }
  120. }
  121. // 开关
  122. onOpen = () =>{
  123. const { openVisible } = this.state;
  124. if(openVisible){
  125. axios.post("/api/v1/power",{power : 2}).then(res => {
  126. const data = res?.data;
  127. if(data && data.code === 0){
  128. this.setState({ openVisible : false });
  129. }
  130. }).catch(err => {
  131. this.toast(err.message,2000);
  132. })
  133. }else {
  134. axios.post("/api/v1/power",{power : 1}).then(res => {
  135. const data = res?.data;
  136. if(data && data.code === 0){
  137. this.setState({ openVisible : true });
  138. }
  139. }).catch(err => {
  140. this.toast(err.message,2000);
  141. })
  142. }
  143. }
  144. render() {
  145. const { pattern , windSpeed , openVisible , data } = this.state;
  146. return (
  147. <div className="control">
  148. <div className='control_item'>
  149. <div className='temperature'>
  150. <p>当前温度: {data?.ambient_temp}℃</p>
  151. <p>室外环境温度: {data?.outdoor_ambient_temp}℃</p>
  152. <p>回风口温度: {data?.air_return_ambient_temp}℃</p>
  153. <p>灯板温度: {data?.light_board_ambient_temp}℃</p>
  154. </div>
  155. <div className='expected_temperature'>
  156. <div style={{ fontSize: '20px' }}>预计温度</div>
  157. <div style={{ fontSize: '50px', marginTop: '60px' }}>{this.state.temperature}℃</div>
  158. </div>
  159. <div>
  160. <div className='up' onClick={this.add}>
  161. <div className='arrow-up' />
  162. </div>
  163. <div className='down' onClick={this.down}>
  164. <div className='arrow-down' />
  165. </div>
  166. </div>
  167. </div>
  168. <div>
  169. <p style={{ fontWeight: 'bold' }}>模式</p>
  170. <div className='pattern'>
  171. <div className={['pattern_item', pattern === 1 ? 'pattern_selected' : null].join(' ')} onClick={()=>{this.patternSelect(1)}}>制冷</div>
  172. <div className={['pattern_item', pattern === 2 ? 'pattern_selected' : null].join(' ')} onClick={()=>{this.patternSelect(2)}}>制热</div>
  173. <div className={['pattern_item', pattern === 3 ? 'pattern_selected' : null].join(' ')} onClick={()=>{this.patternSelect(3)}}>除湿</div>
  174. <div className={['pattern_item', pattern === 4 ? 'pattern_selected' : null].join(' ')} onClick={()=>{this.patternSelect(4)}}>送风</div>
  175. <div className={['pattern_item', pattern === 5 ? 'pattern_selected' : null].join(' ')} onClick={()=>{this.patternSelect(5)}}>自动</div>
  176. </div>
  177. </div>
  178. <div>
  179. <p style={{ fontWeight: 'bold' }}>风速</p>
  180. <div className='pattern'>
  181. <div className={['pattern_item', windSpeed === 6 ? 'speed_selected' : null].join(' ')} onClick={()=>{this.speedSelect(6)}}>自动</div>
  182. <div className={['pattern_item', windSpeed === 1 ? 'speed_selected' : null].join(' ')} onClick={()=>{this.speedSelect(1)}}>一档</div>
  183. <div className={['pattern_item', windSpeed === 2 ? 'speed_selected' : null].join(' ')} onClick={()=>{this.speedSelect(2)}}>二档</div>
  184. <div className={['pattern_item', windSpeed === 3 ? 'speed_selected' : null].join(' ')} onClick={()=>{this.speedSelect(3)}}>三档</div>
  185. <div className={['pattern_item', windSpeed === 4 ? 'speed_selected' : null].join(' ')} onClick={()=>{this.speedSelect(4)}}>四档</div>
  186. <div className={['pattern_item', windSpeed === 5 ? 'speed_selected' : null].join(' ')} onClick={()=>{this.speedSelect(5)}}>五档</div>
  187. </div>
  188. </div>
  189. <div className='switch_item'>
  190. {/*<div className={['sleep_mode', selectType ? 'sleep_select' : null].join(' ')} onClick={this.sleepSelect}>睡眠模式</div>*/}
  191. {
  192. openVisible ?
  193. <img src='./switch_open.png' className='switch' alt="开关" onClick={this.onOpen} />
  194. :
  195. <img src='./switch_close.png' className='switch' alt="开关" onClick={this.onOpen} />
  196. }
  197. </div>
  198. {/* 提示框 */}
  199. <div className="toast_box">
  200. <p id="toast"></p>
  201. </div>
  202. </div>
  203. );
  204. }
  205. }
  206. ReactDOM.createRoot(document.getElementById("root")).render(<Control />);