├── .gitignore
├── App
├── Controller
│ ├── GoodController.php
│ └── UserController.php
└── Model
│ ├── Good.php
│ └── User.php
├── Public
├── index.php
└── show
│ └── index.html
├── Resource
├── App.vue
├── component
│ └── header.vue
├── js
│ ├── entry.js
│ └── main.js
├── package-lock.json
├── package.json
└── webpack.config.js
├── composer.json
└── index.php
/.gitignore:
--------------------------------------------------------------------------------
1 | /.idea
2 | /vendor
3 | /composer.lock
4 | /Public/static
--------------------------------------------------------------------------------
/App/Controller/GoodController.php:
--------------------------------------------------------------------------------
1 | response($items);
23 | }
24 |
25 | public function Post(){
26 | // 添加商品
27 | $item = new Good();
28 | $item->name = $this->request()->get('name');
29 | $item->content = $this->request()->get('content');
30 | $item->cover = $this->request()->get('cover');
31 | $item->category_id = $this->request()->get('category_id');
32 | $item->type_id = $this->request()->get('type_id');
33 |
34 | if ($item->save()){
35 | return $this->response();
36 | } else {
37 | return $this->response("","500", "500000",'添加失败');
38 | }
39 | }
40 |
41 | public function infoGet($id){
42 |
43 | $item = Good::find($id);
44 | if (is_null($item)){
45 | return $this->response("","404", "500404",'未找到商品ID:'.$id);
46 | } else {
47 | return $this->response($item);
48 | }
49 | }
50 |
51 | public function infoPut($id){
52 |
53 | // TODO: 鉴权
54 |
55 | $item = Good::find($id);
56 | if (is_null($item)){
57 | return $this->response("","404", "500404",'未找到商品ID:'.$id);
58 | } else {
59 | if(!is_null($this->request()->get('name'))) {
60 | $item->name = $this->request()->get('name');
61 | }
62 | if(!is_null($this->request()->get('content'))) {
63 | $item->content = $this->request()->get('content');
64 | }
65 | if(!is_null($this->request()->get('cover'))) {
66 | $item->cover = $this->request()->get('cover');
67 | }
68 | if(!is_null($this->request()->get('category_id'))) {
69 | $item->category_id = $this->request()->get('category_id');
70 | }
71 | if(!is_null($this->request()->get('type_id'))) {
72 | $item->type_id = $this->request()->get('type_id');
73 | }
74 | if ($item->save()){
75 | return $this->response($item);
76 | } else {
77 | return $this->response("","500", "500000",'修改失败');
78 | }
79 | }
80 | }
81 |
82 | public function infoDelete($id){
83 | $item = Good::find($id);
84 | if (is_null($item )){
85 | return $this->response("","404", "500404",'未找到商品ID:'.$id);
86 | } else {
87 | if ($item ->delete()){
88 | return $this->response();
89 | } else {
90 | return $this->response("","500", "500000",'删除失败');
91 | }
92 | }
93 | }
94 |
95 | }
96 |
97 |
--------------------------------------------------------------------------------
/App/Controller/UserController.php:
--------------------------------------------------------------------------------
1 | response($users);
18 | }
19 |
20 | public function Post(){
21 | // 用户注册
22 | $user = new User();
23 |
24 | $user->name = $this->request()->get('name');
25 | $user->email = $this->request()->get('email');
26 | $user->password = md5("rY".$this->request->get('password')."sHOP");
27 |
28 | if ($user->save()){
29 | return $this->response();
30 | } else {
31 | return $this->response("","500", "500000",'注册失败!用户名或邮箱重复');
32 | }
33 | }
34 |
35 | public function infoGet($id){
36 |
37 | $user = User::find($id);
38 | if (is_null($user)){
39 | return $this->response("","404", "500404",'未找到用户ID:'.$id);
40 | } else {
41 | return $this->response($user);
42 | }
43 | }
44 |
45 | public function infoPut($id){
46 |
47 | // TODO: 鉴权
48 |
49 | $user = User::find($id);
50 | if (is_null($user)){
51 | return $this->response("","404", "500404",'未找到用户ID:'.$id);
52 | } else {
53 | if(!is_null($this->request()->get('name'))) {
54 | $user->name = $this->request()->get('name');
55 | }
56 | if(!is_null($this->request()->get('email'))) {
57 | $user->email = $this->request()->get('email');
58 | }
59 | if(!is_null($this->request()->get('status'))) {
60 | $user->status = $this->request()->get('status');
61 | }
62 | if(!is_null($this->request()->get('level'))) {
63 | $user->level = $this->request()->get('level');
64 | }
65 | if(!is_null($this->request()->get('password'))) {
66 | $user->password = md5("rY".$this->request->get('password')."sHOP");
67 | }
68 | if ($user->save()){
69 | return $this->response($user);
70 | } else {
71 | return $this->response("","500", "500000",'修改失败');
72 | }
73 | }
74 | }
75 |
76 | public function infoDelete($id){
77 | $user = User::find($id);
78 | if (is_null($user)){
79 | return $this->response("","404", "500404",'未找到用户ID:'.$id);
80 | } else {
81 | if ($user->delete()){
82 | return $this->response();
83 | } else {
84 | return $this->response("","500", "500000",'删除失败');
85 | }
86 | }
87 | }
88 |
89 | public function checkGet($type){
90 | $condition = User::where([ $type => $this->request('s')])->count();
91 | if ($condition > 0){
92 | return $this->response("","200", "500000",'X 已被使用');
93 | } else {
94 | return $this->response("","200", "0",'√ 可以使用');
95 | }
96 | }
97 |
98 |
99 | }
100 |
101 |
--------------------------------------------------------------------------------
/App/Model/Good.php:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
7 |
8 | RyShop
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/Resource/App.vue:
--------------------------------------------------------------------------------
1 |
2 |
26 |
27 |
--------------------------------------------------------------------------------
/Resource/component/header.vue:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 | RyShop V2
7 |
--------------------------------------------------------------------------------
/Resource/js/entry.js:
--------------------------------------------------------------------------------
1 | require('./main.js');
--------------------------------------------------------------------------------
/Resource/js/main.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2019.1 Rytia RyShop
3 | */
4 |
5 | import Vue from 'vue';
6 | import VueRouter from 'vue-router';
7 | import App from './../App.vue'
8 | import ElementUI from 'element-ui';
9 | import 'element-ui/lib/theme-chalk/index.css';
10 |
11 | Vue.use(VueRouter);
12 | Vue.use(ElementUI);
13 |
14 | var data = { a: 1 };
15 |
16 | var vm = new Vue({
17 | el: '#app',
18 | data: data,
19 | render: h => h(App)
20 | });
--------------------------------------------------------------------------------
/Resource/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "requires": true,
3 | "lockfileVersion": 1,
4 | "dependencies": {
5 | "ajv": {
6 | "version": "5.5.2",
7 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
8 | "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
9 | "dev": true,
10 | "requires": {
11 | "co": "^4.6.0",
12 | "fast-deep-equal": "^1.0.0",
13 | "fast-json-stable-stringify": "^2.0.0",
14 | "json-schema-traverse": "^0.3.0"
15 | }
16 | },
17 | "async": {
18 | "version": "2.6.1",
19 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz",
20 | "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==",
21 | "dev": true,
22 | "requires": {
23 | "lodash": "^4.17.10"
24 | }
25 | },
26 | "async-validator": {
27 | "version": "1.8.5",
28 | "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-1.8.5.tgz",
29 | "integrity": "sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA==",
30 | "requires": {
31 | "babel-runtime": "6.x"
32 | }
33 | },
34 | "babel-helper-vue-jsx-merge-props": {
35 | "version": "2.0.3",
36 | "resolved": "https://registry.npmjs.org/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz",
37 | "integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg=="
38 | },
39 | "babel-runtime": {
40 | "version": "6.26.0",
41 | "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
42 | "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
43 | "requires": {
44 | "core-js": "^2.4.0",
45 | "regenerator-runtime": "^0.11.0"
46 | }
47 | },
48 | "big.js": {
49 | "version": "5.2.2",
50 | "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
51 | "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
52 | "dev": true
53 | },
54 | "co": {
55 | "version": "4.6.0",
56 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
57 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
58 | "dev": true
59 | },
60 | "core-js": {
61 | "version": "2.6.3",
62 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.3.tgz",
63 | "integrity": "sha512-l00tmFFZOBHtYhN4Cz7k32VM7vTn3rE2ANjQDxdEN6zmXZ/xq1jQuutnmHvMG1ZJ7xd72+TA5YpUK8wz3rWsfQ=="
64 | },
65 | "deepmerge": {
66 | "version": "1.5.2",
67 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz",
68 | "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ=="
69 | },
70 | "element-ui": {
71 | "version": "2.5.4",
72 | "resolved": "http://registry.npm.taobao.org/element-ui/download/element-ui-2.5.4.tgz",
73 | "integrity": "sha512-VlyPZ1A2VtVJdnu9nUV+u/eGhKaEF+IoENbDgNlUza0Slj6Jb0bC9mzK95JK2g7QSe8YXUWhQVy+d2kZUE2oKQ==",
74 | "requires": {
75 | "async-validator": "~1.8.1",
76 | "babel-helper-vue-jsx-merge-props": "^2.0.0",
77 | "deepmerge": "^1.2.0",
78 | "normalize-wheel": "^1.0.1",
79 | "resize-observer-polyfill": "^1.5.0",
80 | "throttle-debounce": "^1.0.1"
81 | }
82 | },
83 | "emojis-list": {
84 | "version": "2.1.0",
85 | "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
86 | "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
87 | "dev": true
88 | },
89 | "extract-text-webpack-plugin": {
90 | "version": "3.0.2",
91 | "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz",
92 | "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==",
93 | "dev": true,
94 | "requires": {
95 | "async": "^2.4.1",
96 | "loader-utils": "^1.1.0",
97 | "schema-utils": "^0.3.0",
98 | "webpack-sources": "^1.0.1"
99 | }
100 | },
101 | "fast-deep-equal": {
102 | "version": "1.1.0",
103 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
104 | "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
105 | "dev": true
106 | },
107 | "fast-json-stable-stringify": {
108 | "version": "2.0.0",
109 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
110 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
111 | "dev": true
112 | },
113 | "json-schema-traverse": {
114 | "version": "0.3.1",
115 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
116 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
117 | "dev": true
118 | },
119 | "json5": {
120 | "version": "1.0.1",
121 | "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
122 | "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
123 | "dev": true,
124 | "requires": {
125 | "minimist": "^1.2.0"
126 | }
127 | },
128 | "loader-utils": {
129 | "version": "1.2.3",
130 | "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
131 | "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
132 | "dev": true,
133 | "requires": {
134 | "big.js": "^5.2.2",
135 | "emojis-list": "^2.0.0",
136 | "json5": "^1.0.1"
137 | }
138 | },
139 | "lodash": {
140 | "version": "4.17.11",
141 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
142 | "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
143 | "dev": true
144 | },
145 | "minimist": {
146 | "version": "1.2.0",
147 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
148 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
149 | "dev": true
150 | },
151 | "normalize-wheel": {
152 | "version": "1.0.1",
153 | "resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz",
154 | "integrity": "sha1-rsiGr/2wRQcNhWRH32Ls+GFG7EU="
155 | },
156 | "regenerator-runtime": {
157 | "version": "0.11.1",
158 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
159 | "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
160 | },
161 | "resize-observer-polyfill": {
162 | "version": "1.5.1",
163 | "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
164 | "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
165 | },
166 | "schema-utils": {
167 | "version": "0.3.0",
168 | "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz",
169 | "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=",
170 | "dev": true,
171 | "requires": {
172 | "ajv": "^5.0.0"
173 | }
174 | },
175 | "source-list-map": {
176 | "version": "2.0.1",
177 | "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
178 | "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
179 | "dev": true
180 | },
181 | "source-map": {
182 | "version": "0.6.1",
183 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
184 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
185 | "dev": true
186 | },
187 | "throttle-debounce": {
188 | "version": "1.1.0",
189 | "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-1.1.0.tgz",
190 | "integrity": "sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg=="
191 | },
192 | "vue": {
193 | "version": "2.5.22",
194 | "resolved": "https://registry.npmjs.org/vue/-/vue-2.5.22.tgz",
195 | "integrity": "sha512-pxY3ZHlXNJMFQbkjEgGVMaMMkSV1ONpz+4qB55kZuJzyJOhn6MSy/YZdzhdnumegNzVTL/Dn3Pp4UrVBYt1j/g=="
196 | },
197 | "vue-router": {
198 | "version": "3.0.2",
199 | "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.0.2.tgz",
200 | "integrity": "sha512-opKtsxjp9eOcFWdp6xLQPLmRGgfM932Tl56U9chYTnoWqKxQ8M20N7AkdEbM5beUh6wICoFGYugAX9vQjyJLFg=="
201 | },
202 | "webpack-sources": {
203 | "version": "1.3.0",
204 | "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz",
205 | "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==",
206 | "dev": true,
207 | "requires": {
208 | "source-list-map": "^2.0.0",
209 | "source-map": "~0.6.1"
210 | }
211 | }
212 | }
213 | }
214 |
--------------------------------------------------------------------------------
/Resource/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "dependencies": {
3 | "element-ui": "^2.5.4",
4 | "vue": "^2.5.22",
5 | "vue-router": "^3.0.2"
6 | },
7 | "devDependencies": {
8 | "css-loader": "^2.1.0",
9 | "extract-text-webpack-plugin": "^3.0.2",
10 | "file-loader": "^3.0.1",
11 | "node-sass": "^4.11.0",
12 | "sass-loader": "^7.1.0",
13 | "style-loader": "^0.23.1",
14 | "vue-loader": "^15.6.2",
15 | "vue-template-compiler": "^2.5.22"
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/Resource/webpack.config.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2019.1 Rytia RyShop
3 | */
4 | const path = require('path');
5 | const VueLoaderPlugin = require('vue-loader/lib/plugin');
6 | module.exports = {
7 | mode: "development",
8 | entry: "./js/entry.js",
9 | output: {
10 | path: path.resolve(__dirname, '../Public/static'),
11 | filename: "bundle.js"
12 | },
13 | module: {
14 | rules: [
15 | {
16 | test: /\.css$/,
17 | use: ['style-loader', 'css-loader']
18 | },
19 | {
20 | test: /\.scss$/,
21 | use: [
22 | "style-loader", // creates style nodes from JS strings
23 | "css-loader", // translates CSS into CommonJS
24 | "sass-loader" // compiles Sass to CSS, using Node Sass by default
25 | ]
26 | },
27 | {
28 | test: /\.(eot|svg|ttf|woff|woff2)$/,
29 | loader: 'file-loader',
30 | options: {
31 | publicPath: './static/'
32 | }
33 | },
34 | {
35 | test: /\.vue$/,
36 | loader: 'vue-loader'
37 | },
38 | ]
39 | },
40 | plugins: [
41 | // 请确保引入这个插件!
42 | new VueLoaderPlugin()
43 | ],
44 | resolve: {
45 | alias: {
46 | 'vue$': 'vue/dist/vue.esm.js' // 用 webpack 1 时需用 'vue/dist/vue.common.js'
47 | }
48 | }
49 | };
--------------------------------------------------------------------------------
/composer.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "zzfly256/ryshop",
3 | "description": "A simple shop for vhost and vps.",
4 | "type": "project",
5 | "require": {
6 | "php-quickorm/framework": "^1.0"
7 | },
8 | "license": "MIT",
9 | "authors": [
10 | {
11 | "name": "Rytia",
12 | "email": "admin@zzfly.net"
13 | }
14 | ],
15 | "autoload": {
16 | "psr-4": {
17 | "Model\\": "App/Model/",
18 | "Controller\\": "App/Controller/"
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/index.php:
--------------------------------------------------------------------------------
1 |