Browse Source

feat: go chat web1.0

one-file
konenet 4 years ago
parent
commit
8f194f4d9e
  1. 73
      README.md
  2. 37658
      package-lock.json
  3. 10
      package.json
  4. 38
      src/App.css
  5. 25
      src/App.js
  6. 80
      src/chat/Login.jsx
  7. 1061
      src/chat/Panel.jsx
  8. 23
      src/chat/common/param/Params.jsx
  9. 15
      src/chat/proto/message.proto
  10. 58
      src/chat/proto/proto.js
  11. 99
      src/chat/util/Request.jsx
  12. 1
      src/index.css
  13. 14
      src/index.js
  14. 1
      src/logo.svg
  15. 21058
      yarn.lock

73
README.md

@ -1,70 +1,5 @@ @@ -1,70 +1,5 @@
# Getting Started with Create React App
该仓库是go-chat的前端界面。
后端是使用go开发的,基于WebSocket的聊天程序。
后端仓库地址:
https://github.com/kone-net/go-chat
This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
## Available Scripts
In the project directory, you can run:
### `yarn start`
Runs the app in the development mode.\
Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
The page will reload if you make edits.\
You will also see any lint errors in the console.
### `yarn test`
Launches the test runner in the interactive watch mode.\
See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
### `yarn build`
Builds the app for production to the `build` folder.\
It correctly bundles React in production mode and optimizes the build for the best performance.
The build is minified and the filenames include the hashes.\
Your app is ready to be deployed!
See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
### `yarn eject`
**Note: this is a one-way operation. Once you `eject`, you can’t go back!**
If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own.
You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it.
## Learn More
You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
To learn React, check out the [React documentation](https://reactjs.org/).
### Code Splitting
This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting)
### Analyzing the Bundle Size
This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size)
### Making a Progressive Web App
This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app)
### Advanced Configuration
This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration)
### Deployment
This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment)
### `yarn build` fails to minify
This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify)

37658
package-lock.json generated

File diff suppressed because it is too large Load Diff

10
package.json

@ -6,16 +6,24 @@ @@ -6,16 +6,24 @@
"@testing-library/jest-dom": "^5.11.4",
"@testing-library/react": "^11.1.0",
"@testing-library/user-event": "^12.1.10",
"antd": "^4.16.13",
"axios": "^0.24.0",
"js-audio-recorder": "^1.0.7",
"protobufjs": "^6.11.2",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react-infinite-scroll-component": "^6.1.0",
"react-router-dom": "^5.3.0",
"react-scripts": "4.0.3",
"socket.io-client": "^4.3.2",
"web-vitals": "^1.0.1"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
"eject": "react-scripts eject",
"proto": "npx pbjs -t json-module -w commonjs -o src/chat/proto/proto.js src/chat/proto/*.proto"
},
"eslintConfig": {
"extends": [

38
src/App.css

@ -1,38 +0,0 @@ @@ -1,38 +0,0 @@
.App {
text-align: center;
}
.App-logo {
height: 40vmin;
pointer-events: none;
}
@media (prefers-reduced-motion: no-preference) {
.App-logo {
animation: App-logo-spin infinite 20s linear;
}
}
.App-header {
background-color: #282c34;
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
font-size: calc(10px + 2vmin);
color: white;
}
.App-link {
color: #61dafb;
}
@keyframes App-logo-spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}

25
src/App.js

@ -1,25 +0,0 @@ @@ -1,25 +0,0 @@
import logo from './logo.svg';
import './App.css';
function App() {
return (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<p>
Edit <code>src/App.js</code> and save to reload.
</p>
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
</header>
</div>
);
}
export default App;

80
src/chat/Login.jsx

@ -0,0 +1,80 @@ @@ -0,0 +1,80 @@
import React from 'react';
import {
Button,
Form,
Input,
message
} from 'antd';
import { axiosPostBody } from './util/Request';
import * as Params from './common/param/Params'
class Login extends React.Component {
constructor(props) {
super(props)
this.state = {
}
}
componentDidMount() {
}
onFinish = (values) => {
let data = {
username: values.username,
password: values.password
}
axiosPostBody(Params.LOGIN_URL, data)
.then(response => {
message.success("登录成功!");
localStorage.username = response.data.username
this.props.history.push("panel/" + response.data.uuid)
});
};
onFinishFailed = (errorInfo) => {
console.log('Failed:', errorInfo);
};
render() {
return (
<div>
<Form
name="basic"
labelCol={{ span: 9 }}
wrapperCol={{ span: 6 }}
onFinish={this.onFinish}
onFinishFailed={this.onFinishFailed}
autoComplete="off"
style={{ marginTop: 150 }}
>
<Form.Item
label="Username"
name="username"
rules={[{ required: true, message: 'Please input your username!' }]}
>
<Input />
</Form.Item>
<Form.Item
label="Password"
name="password"
rules={[{ required: true, message: 'Please input your password!' }]}
>
<Input.Password />
</Form.Item>
<Form.Item wrapperCol={{ offset: 9, span: 6 }}>
<Button type="primary" htmlType="submit">
Submit
</Button>
</Form.Item>
</Form>
</div>
);
}
}
export default Login;

1061
src/chat/Panel.jsx

File diff suppressed because it is too large Load Diff

23
src/chat/common/param/Params.jsx

@ -0,0 +1,23 @@ @@ -0,0 +1,23 @@
export const API_VERSION = "/api/v1/";
//local
export const HOST = "http://local.deepsky.com:8888";
export const LOGIN_URL = HOST + '/user/login'
export const USER_URL = HOST + '/user/'
export const USER_LIST_URL = HOST + '/user'
export const USER_FRIEND_URL = HOST + '/friend'
export const MESSAGE_URL = HOST + '/message'
export const GROUP_LIST_URL = HOST + '/group'
export const GROUP_USER_URL = HOST + '/group/user/'
export const FINANCIAL_PARAM_URL = HOST + API_VERSION + 'financial-param/';
export const AUTH_HEADER_KEY = "Authorization";
export const TOKEN_PREFIX = "Bearer ";

15
src/chat/proto/message.proto

@ -0,0 +1,15 @@ @@ -0,0 +1,15 @@
syntax = "proto3";
package protocol;
message Message {
string avatar = 1;
string fromUsername = 2;
string from = 3;
string to = 4;
string content = 5;
int32 contentType = 6;
string type = 7;
int32 messageType = 8;
string url = 9;
bytes file = 10;
}

58
src/chat/proto/proto.js

@ -0,0 +1,58 @@ @@ -0,0 +1,58 @@
/*eslint-disable block-scoped-var, id-length, no-control-regex, no-magic-numbers, no-prototype-builtins, no-redeclare, no-shadow, no-var, sort-vars*/
// "use strict";
var $protobuf = require("protobufjs/light");
var $root = ($protobuf.roots["default"] || ($protobuf.roots["default"] = new $protobuf.Root()))
.addJSON({
protocol: {
nested: {
Message: {
fields: {
avatar: {
type: "string",
id: 1
},
fromUsername: {
type: "string",
id: 2
},
from: {
type: "string",
id: 3
},
to: {
type: "string",
id: 4
},
content: {
type: "string",
id: 5
},
contentType: {
type: "int32",
id: 6
},
type: {
type: "string",
id: 7
},
messageType: {
type: "int32",
id: 8
},
url: {
type: "string",
id: 9
},
file: {
type: "bytes",
id: 10
}
}
}
}
}
});
module.exports = $root;

99
src/chat/util/Request.jsx

@ -0,0 +1,99 @@ @@ -0,0 +1,99 @@
import axios from 'axios'
import qs from 'qs'
import {
message
} from 'antd';
function axiosPost(url, data, options = { dealError: false }) {
return new Promise((resolve, reject) => {
axios.post(url, qs.stringify(data), {
headers: {
// "Authorization": Params.TOKEN_PREFIX + localStorage.token,
'content-type': 'application/x-www-form-urlencoded'
}
}).then(response => {
if (response.data.code === 0) {
resolve(response.data);
} else {
if (options.dealError) {
reject(response);
} else {
message.error(response.data.msg);
}
}
}).catch(_error => {
message.error('网络错误,请稍候再试!');
});
});
}
function axiosPostBody(url, data, options = { dealError: false }) {
return new Promise((resolve, reject) => {
axios.post(url, data, {
headers: {
// "Authorization": Params.TOKEN_PREFIX + localStorage.token,
}
}).then(response => {
if (response.data.code === 0) {
resolve(response.data);
} else {
if (options.dealError) {
reject(response);
} else {
message.error(response.data.msg);
}
}
}).catch(_error => {
message.error('网络错误,请稍候再试!');
});
});
}
function axiosPut(url, data = {}, options = { dealError: false }) {
return new Promise((resolve, reject) => {
axios.put(url, data, {
headers: {
// "Authorization": Params.TOKEN_PREFIX + localStorage.token
}
}).then(response => {
if (response.data.code === 0) {
resolve(response.data);
} else {
if (options.dealError) {
reject(response);
} else {
message.error(response.data.msg);
}
}
}).catch(_error => {
message.error('网络错误,请稍候再试!');
});
});
}
function axiosGet(url, data = {}, options = { dealError: false }) {
return new Promise((resolve, reject) => {
axios.get(url, {
params: {
...data,
},
headers: {
// "Authorization": Params.TOKEN_PREFIX + localStorage.token
}
}).then(response => {
if (response.data.code === 0) {
resolve(response.data);
} else {
if (options.dealError) {
reject(response);
} else {
message.error(response.data.msg);
}
}
}).catch(_error => {
message.error('网络错误,请稍候再试!');
});
});
}
export { axiosPost, axiosPut, axiosPostBody, axiosGet }

1
src/index.css

@ -1,3 +1,4 @@ @@ -1,3 +1,4 @@
@import '~antd/dist/antd.css';
body {
margin: 0;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',

14
src/index.js

@ -1,13 +1,19 @@ @@ -1,13 +1,19 @@
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import Login from './chat/Login';
import Panel from './chat/Panel';
import { Switch, Route, BrowserRouter } from 'react-router-dom';
import reportWebVitals from './reportWebVitals';
ReactDOM.render(
<React.StrictMode>
<App />
</React.StrictMode>,
<BrowserRouter>
<Switch>
<Route path="/login" component={Login} />
<Route path="/panel/:user" component={Panel} />
<Route path="/" component={Login} />
</Switch>
</BrowserRouter>,
document.getElementById('root')
);

1
src/logo.svg

@ -1 +0,0 @@ @@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 841.9 595.3"><g fill="#61DAFB"><path d="M666.3 296.5c0-32.5-40.7-63.3-103.1-82.4 14.4-63.6 8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6 0 8.3.9 11.4 2.6 13.6 7.8 19.5 37.5 14.9 75.7-1.1 9.4-2.9 19.3-5.1 29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50 32.6-30.3 63.2-46.9 84-46.9V78c-27.5 0-63.5 19.6-99.9 53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7 0 51.4 16.5 84 46.6-14 14.7-28 31.4-41.3 49.9-22.6 2.4-44 6.1-63.6 11-2.3-10-4-19.7-5.2-29-4.7-38.2 1.1-67.9 14.6-75.8 3-1.8 6.9-2.6 11.5-2.6V78.5c-8.4 0-16 1.8-22.6 5.6-28.1 16.2-34.4 66.7-19.9 130.1-62.2 19.2-102.7 49.9-102.7 82.3 0 32.5 40.7 63.3 103.1 82.4-14.4 63.6-8 114.2 20.2 130.4 6.5 3.8 14.1 5.6 22.5 5.6 27.5 0 63.5-19.6 99.9-53.6 36.4 33.8 72.4 53.2 99.9 53.2 8.4 0 16-1.8 22.6-5.6 28.1-16.2 34.4-66.7 19.9-130.1 62-19.1 102.5-49.9 102.5-82.3zm-130.2-66.7c-3.7 12.9-8.3 26.2-13.5 39.5-4.1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-23.4 14.2 2.1 27.9 4.7 41 7.9zm-45.8 106.5c-7.8 13.5-15.8 26.3-24.1 38.2-14.9 1.3-30 2-45.2 2-15.1 0-30.2-.7-45-1.9-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8 6.2-13.4 13.2-26.8 20.7-39.9 7.8-13.5 15.8-26.3 24.1-38.2 14.9-1.3 30-2 45.2-2 15.1 0 30.2.7 45 1.9 8.3 11.9 16.4 24.6 24.2 38 7.6 13.1 14.5 26.4 20.8 39.8-6.3 13.4-13.2 26.8-20.7 39.9zm32.3-13c5.4 13.4 10 26.8 13.8 39.8-13.1 3.2-26.9 5.9-41.2 8 4.9-7.7 9.8-15.6 14.4-23.7 4.6-8 8.9-16.1 13-24.1zM421.2 430c-9.3-9.6-18.6-20.3-27.8-32 9 .4 18.2.7 27.5.7 9.4 0 18.7-.2 27.8-.7-9 11.7-18.3 22.4-27.5 32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9 3.7-12.9 8.3-26.2 13.5-39.5 4.1 8 8.4 16 13.1 24 4.7 8 9.5 15.8 14.4 23.4zM420.7 163c9.3 9.6 18.6 20.3 27.8 32-9-.4-18.2-.7-27.5-.7-9.4 0-18.7.2-27.8.7 9-11.7 18.3-22.4 27.5-32zm-74 58.9c-4.9 7.7-9.8 15.6-14.4 23.7-4.6 8-8.9 16-13 24-5.4-13.4-10-26.8-13.8-39.8 13.1-3.1 26.9-5.8 41.2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1-22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50-32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z"/><circle cx="420.9" cy="296.5" r="45.7"/><path d="M520.5 78.1z"/></g></svg>

Before

Width:  |  Height:  |  Size: 2.6 KiB

21058
yarn.lock

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save